2015070701 - EffactiveJava笔记 - 第13条 使类和成员的可访问性最小(3)

原创 2015年07月07日 06:18:17

   成员属性绝对不能公有的.为什么呢?如果此属性是非final,或者执行可变对象的final引用,一旦使属性公开,就等于放弃了对存储在这个属性中数据进行限制的能力,放弃了强制此属性不可变的能力;当属性被修改时,失去了对它采取任何行动的能力.

   因此包含共有可变属性的类不是线程安全的,即使属性是final的,并且引用不可变对象.当属性变成公有,就放弃了切换到”一种新的内部数据表示法”的灵活性.

   (个人理解成员属性不可公开,只有进行设置为私有,那么可以对赋值和取值方法进行限制,才能最大限度保持数据的安全性和有效性!)

   静态属性也绝对不能公有的!例外情况是常量,通过共有的静态final属性来暴露常量.非常重要的一点,要么常量包含基本数据值,要么常量指向不可变对象的引用.如果final属性包含可变对象的引用,那就具有非fianl属性的缺点.引用不会改变,但引用的对象却可以改变,会导致灾难性的后果.

   长度非0的数组总是可变的,所以,类具有共有的静态final数组,或者返回这种属性的访问方法,这几乎总是错误的!为什么呢?因为只要获取引用地址,那么引用的内容可以随便修改.

   public static final Thing[]VALUES = {…};

   那么如何解决这个问题呢?

   1.使共有数组变成私有,并增加一个公有的不可变列表.

   private static final Thing[] PRIVATE_VALUES = {…};

   public static final List<Thing> VALUES

      = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

   2.使数组私有,添加公有访问方法,返回值是私有数组的数据克隆.

   private static finalThing[] PRIVATE_VALUES = {…};

   public static final Thing[ ]values(){

     return PRIVATE_VALUES.clone();

   }

   两种方法如何选择呢?考虑客户端如何处理结果,哪种返回类型方便,哪种会有更好的性能.

   你应该尽可能降低可访问性.仔细设计最小的公有API,应该防止把任何散乱的类,接口,和成员变成API的一部分.除了常量特殊情况外,公有类不应该包含共有属性.确保共有静态属性引用的对象都是不可变的.

  

   {你如何使用上面的知识呢?

   1.类的属性和方法最小范围被访问

   2.只要获取引用类型属性,那么其数据基本都可以被修改!}


版权声明:本文为博主原创文章,未经博主允许不得转载。

2015070508 - EffactiveJava笔记 - 第13条 使类和成员的可访问性最小(2)

Java那些机制完成信息隐藏呢?    1.访问控制决定类,接口,成员的可访问性;    2.对象的可访问性由该对象声明所在的位置,以及修饰对象的访问控制修饰符共同决定.      第一规则:...

Effective Java 第13条 : 使类和成员的可访问性最小化

转载地址: http://www.blogjava.net/kuuyee/archive/2013/06/14/400560.html 软件设计的基本原则之一,就是系统要模块化,模块...

第13条:使类和成员的可访问性最小化

概念: 要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他细节。 设计良好的模块会隐藏所有的实现细节,把他的API和他的实现清晰的分割...

第13条 类与接口——使类和成员的可访问性最小化

要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。正确使用修饰符对于实现信息隐藏是非常关键的。        第一规则很简单:...

2015070505 - EffactiveJava笔记 - 第64条 努力保持失败原子性

20150705 星期日 北京    当对象抛出异常后,通常期望这个对象仍然保持在一种定义良好的可用状态,即使异常发生在执行某个操作的过程中间.这对于检查时异常尤为重要.因为调用者期望能从异常中进行...

2015070301 - EffactiveJava笔记 - 第52条 通过接口引用对象(1)

20150703 星期五 早晨    第40条建议,应该使用接口而不是类作为参数的类型;    一般而言,应该优先使用接口而不是类来引用对象.如果有合适的接口类型,那么参数,返回值,变量,域来说,...

2015070303 - EffactiveJava笔记 - 第53条 接口优于反射机制

20150703 星期五 北京    反射机制,提供通过运行程序访问关于已经装载的类的信息的能力.    反射机制,允许一个类使用另外一个类,即使当前者被编译的时候后者还根本不存在.    反射...

2015070404 - EffactiveJava笔记 - 第57条 只对异常使用异常(1)

20150704 星期六 北京     猜测下面的代码意图是什么呢?     try {        int i =0;        while (true){          range[i+...

2015062806 - EffactiveJava笔记 - 第41条 慎用重载(2)

----->02.基本类型和包装类导致的重载问题     java1.5之前,所有基本类型根本不同于所有的引用类型,但是引入自动拆箱和装箱,导致了真正的麻烦.     import java.ut...

Effective Java读书笔记-使类和成员的可访问性最小化

区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部其它的模块而言,是否隐藏了内部的数据和其他实现的细节。设计良好的模块会隐藏所有的实现细节。设计良好的模块会隐藏所有的实现细节,把它...
  • G7S9R
  • G7S9R
  • 2017年11月20日 16:42
  • 43
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2015070701 - EffactiveJava笔记 - 第13条 使类和成员的可访问性最小(3)
举报原因:
原因补充:

(最多只允许输入30个字)