学习effective java-13类和接口之使类和成员的可访问性减少到最小

来源:互联网 发布:淘宝退货太多 编辑:程序博客网 时间:2024/06/05 12:48
 该知识点是自己从书籍中学习的笔记。

         一个好的设计就在于它与其他模块的交互仅仅是通过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

该结果是正确的。