java编程思想(读书笔记):5.隐藏实现细目

五、隐藏实现细目
Package(程序库单元):每个编译单元只能有一个public class,否则编译器不接受。Package之外的世界无法看见该编译单元内的其余classes,这些classes主要用来为那个主要的public class提供支持。
应该明白,关键字package和import所提供的,乃是将单一全局命名空间加以切割。
如果想出货时取消调试的assertions功能,可以开发第二个assert class,并将它置于另一个不同的package中,这样,通过导入不同的package,便可以使程序代码从调试版变为出货版,这个技巧可用于任何类型的条件编译程序代码上。
接口与实现:
我们需要控制访问权限,在数据型别中建立界限的两个理由:
1. 建立起一道界限,指明哪些是客户端程序员可以使用的,哪些是他们不能使用的。
2. 将接口和实现分离。
Class的访问权限:为classes 而设的访问权限,可以控制客户端程序员是否有权利产生某个class的对象。
虽然通常不这样做,但是编译单元内的确可以不含任何public class。
注意:class不能是private(这么做会使得除了他自己没有任何class可以取用)或者protected,当然有特例,事实上,inner class可以是private或者protected。所以对于class的访问权限,只有friendly或者public,如果你不希望其他任何人取用某个class,请将其构造函数声明为private,这样就不能通过new来产生一个对象。
不同通过new的常规方法来产生对象,那么我们怎么产生对象呢?方法两种:
代码演示

class Soup{
    //private且空的构造函数
    private Soup(){
    }
    //通过static函数来产生新的Soup对象并返回其reference。
    public static Soup makeSoup(){
        return new Soup();
    }
    //使用“singleton”的设计模式,因为它让整个程序面对某个class时只能产生唯一一个对象。
    private static Soup ps1 = new Soup();
    public static Soup access(){
        return ps1;
    }
    public void f(){}
}
public class Mian{
    public static void main(String[] args){
// Soup pr = new Soup();不能通过构造函数构造
        Soup pr1 = Soup.makeSoup();
        Soup pr2 = Soup.access();
    }
}

方法一适用:在执行Soup之前先进行某些额外处理,或者希望记录(或限制)究竟有多少个Soup对象被产生出来,非常适用。
方法二适用:只产生唯一的一个对象。

你可能感兴趣的:(Class,调试,编辑器,库)