一个好的设计就在于它与其他模块的交互仅仅是通过api来交互的,从不关心其具体实现细节。就是说信息隐藏和封装性较好。
通过修饰符可以做到信息的封装,目前有四种修饰符:
私有(private)--仅仅本类可以访问。
保护(protected)--仅仅本类以及子类可以访问。
默认—就是什么也没有,可以被本包中任意访问。
公有(public)--任何类都可以访问。
尽量将类中的属性都设置为私有的,然后通过getter方法提供调用。
有这样一个规则:当你重写父类的方法的时,子类的访问级别不能够比父类低。如父类是protectd的,那么子类必须是protected或者public;父类是默认的,则子类必须是默认的或者public、protected的。
通过公有方法来暴露常量是允许的,但是如果一个类中含有常量是静态的并且是final的数组则有可能会有错误,因为客户可以修改其中的值,如下:
public class A {
public static final int[] a = { 1, 2, 3 };
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
A.a[i] = i + 2;
}
for (int i : A.a) {
System.out.println(i);
}
}
}//虽然编译无错误,但是这是不允许的。
输出结果是:
2
3
4
这明显是改变了A中数组a元素的值,数组a的大小未改变。
为了修改上面的问题,你可以将数组声明为私有的,然后提供一个clone的方式来获取数组信息,虽然会导致性能上的一些下降。修改后的代码如下:
public class A {
private static final int[] a = { 1, 2, 3 };
public static int[] getA(){
return (int[])a.clone();
}
public static void main(String[] args) {
int[] getA = getA();
for (int i = 0; i < 3; i++) {
getA[i] = i + 2;
}
for (int i : getA) {
System.out.println(i);
}
System.out.println("-------------");
getA = getA();
for (int i : getA) {
System.out.println(i);
}
}
}输出结果:
2
3
4
-------------
1
2
3
该结果是正确的。