《Think in java·第 5 章隐藏实施过程》
从第一句话,就感觉本章会令我不满意。“将发生变化的东西与保持不变的东西分隔开”与封装一毛钱的关系都没有。封装变化又称OCP,与OOP的封装性无关。
关于库(中的类A)的设计,依赖库的程序B,要求库是向下兼容的。程序B依赖的是A的接口。库的创建者不管想怎样自由地进行修改与改进,前提是不修改A的接口。
这里,A的接口,表示A需要提供的服务,设计者不可能、也不会考虑该服务(的方法名、参数)未来是否保持不变或改变。
所以,JDK中,类的接口变化的采用的方式:
- 列举 不赞成使用(Deprecated)的类的接口/方法
- Java8 的默认方法为Java接口的变化 提供后悔药。
封装就是形成类的接口,与其他的想法无关。Java 的“访问指示符”的概念,仅仅用于限制出有限的类的接口。当然,如果你的类所有的东西都是public——都是接口,按照不修改类的接口红线,后果的确是:你对方法名、参数的修改与改进“动弹不得”。问题是,你为什么要修改方法名、参数——接口要素?修改方法的实现才是通常的库创建者的希望。
5.1 包:库单元
【The reason for all this importing is to provide a mechanism to manage name spaces. 】看起来怎么这么别扭。Java引入包(package)的主要原因,是为了划分命名空间;而import语句(引入/导入语句),不过是一个偷懒的手段,此外没有任何的含义。
【迄今为止,本书的大多数例子都仅存在于单个文件中,而且设计成局部(本地)使用,没有同包名发生冲突(在这种情况下,类名置于“默认包”内)。这是一种有效的做法,而且考虑到问题的简化,本书剩下的部分也将尽可能地采用它。】,推荐使用BlueJ,我们的第一个例子就不在默认包中。默认包是好不好的东西,除非你使用控制台学习Java而且不喜欢麻烦的目录转换。
5.1.1 创建独一无二的包名 环境变量CLASSPATH。【1. 自动编译 为导入的类首次创建一个对象时(或者访问一个类的static 成员时),编译器会在适当的目录里寻找同名
的.class 文件(所以如果创建类X 的一个对象,就应该是X.class)。若只发现X.class,它就是必须使用的那一个类。然而,如果它在相同的目录中还发现了一个X.java,编译器就会比较两个文件的日期标记。如果X.java 比X.class 新,就会自动编译X.java,生成一个最新的X.class。对于一个特定的类,或在与它同名的.java 文件中没有找到它,就会对那个类采取上述的处理。】哦?!
5.1.2 自定义工具库 1. CLASSPATH 的陷阱
5.1.3 利用导入改变行为 看看怎么模拟断言机制的。通过改变导入的package,使用两个包中同名的类。
5.1.4 包的停用 没有没有用。
5.2 Java 访问指示符
5.2.1 “友好的”—— Vs. 《6.2.3 包级私有》
5.2.2 public:接口访问
5.2.3 private:不能接触 JVM对private方法的优化;private 构造器;
5.2.4 protected:“友好的一种 好在我在《2.1.1 里氏替换原则》就讲了继承;
5.3 接口与实现
本来以为他要讲接口与实现的分离(separation of interface and implementation),原来还是信息隐藏(他的implementation hiding)、 encapsulation。以及类的接口和类的实现的分离——这不就是封装吗?而类的接口凭什么必须是public——【client programmers can’t do anything
but send messages to the public interface】,通常protected被认为是接口。
后面都是些无关紧要的东西,比如类的结构,我喜欢:
public class Xxxx{
<域声明>
<构造器,初始化块>
<方法定义>
<内部类、内部接口>
}
【类的使用者可从上向下依次阅读】,拜托,他应该读的是
JavaDoc而非源代码。
5.4 类访问
public class
这一章给60分。
读TIJ -5 隐藏实施过程,布布扣,bubuko.com
读TIJ -5 隐藏实施过程
原文:http://blog.csdn.net/yqj2065/article/details/37351735