区分程序设计的好坏之一就是看模块之间实现细节的隐藏。这其实就是信息隐藏或者称之为封装,是软件设计的基本原则之一。
成员访问级别
在Java
程序设计准则中,第一规则就是尽可能地使每个类或者成员不被外界访问,即访问级别尽量小。
在Java
中,对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别。按可访问性递增排序如下:
1. private
只能在声明此成员的类中才能访问
2. package private
与此成员在同一包中都可以访问。不添加任何修饰符代表此级别。
3. protected
声明此成员的类、与声明此成员的类同一包、及该类的子类都可以访问
4. public
任何都可以访问
设计要点
- 当你精心设计完程序后,默认地,所有的成员都为
private
。除非是同一包中的成员需要访问,可修改为package private
,否则不予修改; - 成员可访问性,
package private
到protected
是跨越巨大的。一旦成员被修饰为protected
,则以后都需要维护此成员; - 有个特殊情况,在接口中声明的方法,默认为
public
,实现方法也为public
。子类重写父类的方法,可访问级别不能低于父类的可访问级别; - 实例域决不能用
public
修饰,除非此域是常量; - 针对数据域,就算采用
final
修饰,其值还是可能会被改变的。针对此种设计,可以采用如下方法。
//以为是不可变的域,但其实是可变的
public static final Thing[] VALUES = {...};
返回此种域,你可以
//推荐
private static final Thing[] PRIVATE_VALUES = {...};
public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
或
private static final Thing[] PRIVATE_VALUES = {...};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
这样可确保成员属性不会被更改。
总结
- 使域可访问性尽量最小;
- 当
API
设计完成后,尽量避免向API
中添加其他成员; - 除了公有静态
final
域为public
之外,其他域都不允许为public
,且要确保公有静态final
域所引用的对象都是不可变的。