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.对象的可访问性由该对象声明所在的位置,以及修饰对象的访问控制修饰符共同决定.      第一规则:...

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

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

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

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

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

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

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

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

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

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

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

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

2015062705 - EffactiveJava笔记 - 第38条 检查参数的有效性

第七章 方法     主要涉及方法的以下方面:如何处理参数和返回值,如何设计方法签名,如何为方法编写文档.适合普通方法和构造方法.    焦点集中在可用性,健壮性和灵活性上.      第38...

2015062808 - EffactiveJava笔记 - 第43条 返回零长度的数组或者集合,而非null

20150628 星期日 北京     对下面编程情景是否很熟悉呢?        privatefinal List cheeseInStock = ...;     ...

2015070405 - EffactiveJava笔记 - 第57条 只对异常使用异常(2)

异常只应该使用在异常情况下,它们永远不应该用于正常的控制流中.对API设计的启发.    设计良好的API不应该强迫它的客户端为了正常控制流而使用异常.    如果类具有”状态相关”的方法,即只有特定...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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