好的模块设计应该尽最大可能封装好自己的内部信息,这样可以把模块之间的耦合程度降到最低。开发得以并行,无疑这将加快开发的速度,便于系统地维护。Java中通过访问控制符来解决这个问题。
public表示这个类在任何范围都可用。
protected表示只有子类和包内的类可以使用
private-package(default)表示在包内可用
private表示只有类内才可以用
在设计的时候应该尽可能的使每一个类或者成员不被外界所访问。在设计一个类的时候应该尽量的按照4321得顺序设计。如果一个类只是被另一个类使用,那么应该考虑把它设计成这个类的内部类。通常 public的类不应该有public得字段,不过我们通常会用一个类来定义所有的常量,这是允许的。不过必须保证这些字段要么是基本数据类型要么引用指向的对象是不可修改的。不然他们将可能被修改。例如下面的定义中data就是不合理的,其他人可以改变数组中的内容,有安全漏洞,后面两个没有问题。
public class Con
{
public static final int[] data = {1,2,3};// it is bad
public static final String hello = "world";
public static final int i = 1;
}
public class Con
{
public static final int[] data = {1,2,3};// it is bad
public static final String hello = "world";
public static final int i = 1;
}
解决data安全隐患的方法有两种:
- 将公有方法替换为一个私有数组,以及一个公有的非可变列表
private static final Type[] PRIVATE_VALUES = {...};
public static final List VALUES = Collections.unmodifiableLis(Arrays.asList(PRIVATE_VALUES));
private static final Type[] PRIVATE_VALUES = {...};
public static final List VALUES = Collections.unmodifiableLis(Arrays.asList(PRIVATE_VALUES));
- 把公有的数组替换为一个公有的方法,它返回私有数组的一份拷贝
private static final Type[] PRIVATE_VALUES = {...};
public static final Type[] values(){
return (Type[])PRIVATE_VALUES.clone();
}
private static final Type[] PRIVATE_VALUES = {...};
public static final Type[] values(){
return (Type[])PRIVATE_VALUES.clone();
}
总之,应该防止把任何杂散的累接口和成员变成API的一部分,除了公有静态final域的特殊情形之外,公有类不应该包含公有域,并且确保有静态final域所引用的对性是不可变的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ilibaba/archive/2009/01/16/3795124.aspx