java 板


LINE

※ 引述《hougzou (该换个重训方法了)》之铭言: : ※ 引述《ChienHsiang (不务正业工程师)》之铭言: : : 或许也可以把 Java Bean 的"习惯性用法"当成一种 Pattern 吧 : : 我觉得倒没什麽谁对谁错... : : 何况很多以前大家认为错的,现在又是那麽的理所当然... : : Pattern Refactory後,又是一种新的Pattern不是吗? : 物件导向概念里头,有个大家都知道,却都常忽略的概念,就是「封装」。 : 这东西简单来说,就是类别中的变数,不能给其他类别直接存取,而必须 : 提供setter/getter来设定或取得「变数值」。 : (注意!直接操作变数与间接取值是完全不同的两回事) : 这做法可以让类别设计者能保留程式内容的弹性,当需求有变时,只需更改 : 类别内部对变数操作的方法,不用让引用此类别的程式区段同时做修改。 : 至於为什麽要用setXXX以及getXXX。 : 如果某人的Java类别没有重复利用的价值,那麽setXXX/getXXX改为任何有效的 : 方法名称都可以。可是,如果这个类别有重复利用的可能,而且不知道会在 : 哪个领域用到,则采用getXXX/setXXX反而可以让这只类别提供Java Bean的功能。 : 不过之所以用set/get来当字首,简单来说就是短、简洁、易记。试想一下, : 如果改用assignXXX/fetchXXX,是不是觉得很累缀哩?依学习以及使用的观点 : 来看用set/get的确是种行为正确的选择。 : 希望这些能解答讨论串原PO的疑惑。 最近在重构 (Refactoring) 的时候遇到需要把所有直接存取的叙述全部改成 Getter 和 Setter 的情境,我正把一棵类别大爆炸 (超庞大) 的继承树引入装饰者模式 (Decorator Pattern),然而,若装饰者继承的元件含有可见的 (Visible, for instance: public, protected) 成员变数,那麽装饰者无法引导呼叫端使用内部元件的变数,而被误用至装 饰者本身的变数。 举例而言: /** * 含有可见变数的元件 */ public class Component { // Oops! 可见的变数!! public int properties; // 复杂的计算会修改此物件的属性 public int complexMethod(int param) { return param + (properties++); } } /** * 元件的装饰者 */ public class Decorator extends Component { private Component component; public Decorator(Component component) { this.component = component; } // 把计算委托给元件处理 public int complexMethod(int param) { return component.complexMethod(param); } } /** * 错误的呼叫者 */ public class Drive { public static void main(String args[]) { Component component = new Component(); Decorator decorator = new Decorator(component); // 修改数值至装饰者,但应修改至元件才对,错误! decorator.properties = -1; // 因为上面给值没给到元件,所以这边回传的值不会反应到结果 int result = decorator.complexMethod(0); // 期望 result 等於 -1, 但却等於 0 } } ========================================================================= 「封装」是解决之道 ========================================================================= 修改後的元件与装饰者: /** * 包装後的元件 */ public class Component { // 将此变数设为不可见 (private) private int properties; public int complexMethod(int param) { return param + (properties++); } // Setter of properties public void setProperties(int properties) { this.properties = properties; } // Getter of properties public int getProperties() { return properties; } } /** * 元件的装饰者 */ public class Decorator extends Component { private Component component; public Decorator(Component component) { this.component = component; } public int complexMethod(int param) { return component.complexMethod(param); } @Override public int getProperties() { // 委托元件将属性回传 return component.getProperties(); } @Override public void setProperties(int properties) { // 设定属性至元件内 component.setProperties(properties); } } /** * 正确的呼叫者 */ public class Drive { public static void main(String args[]) { Component component = new Component(); Decorator decorator = new Decorator(component); // 透过 Setter 来设定元件的变数,正确! decorator.setProperties(-1); // 因为上面给值到元件,所以这边回传的值会反应到结果 int result = decorator.complexMethod(0); // 期望 result 等於 -1, 确实地 result 正好等於 -1 } } 引入装饰者模式至一棵继承树必须确保所有的成员变数都是不可见 (invisible, for instance: private) 的,否则无法阻止呼叫者修改装饰者的变数,要达到所有的成员变 数都是不可见,请封装您的元件变数,拒绝外面任何的使用者修改。 因此,请没事就封装您的成员变数 XD (无误) --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.247.13







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping 或 站内搜寻

TOP