ToB企服应用市场:ToB评测及商务社交产业平台

标题: 《Effective Java》第16条:要在仅有类中使用访问方法而非公有域 [打印本页]

作者: 道家人    时间: 2022-9-16 17:15
标题: 《Effective Java》第16条:要在仅有类中使用访问方法而非公有域
《Effective Java》第16条:要在仅有类中使用访问方法而非公有域

一、 问题

有时候我们需要定义一些类用来集中实例域(Java对象中的数据)。经常我们会把这些数据域声明为public,可以被直接访问。这样公有类暴露了它的数据域,有以下两个缺点:
1、要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各处了
二、分析
  1.     class Point {
  2.         public double x;
  3.         public double y;
  4.     }
复制代码
上面数据域是可以被直接访问,没有提供封装功能,我们应该用包含私有域和公有方法的类代替
  1.     class Point {
  2.         private double x;
  3.         private double y;
  4.         public Point(double x, double y) {
  5.             this.x = x;
  6.             this.y = y;
  7.         }
  8.         public double getX() {
  9.             return x;
  10.         }
  11.         public double getY() {
  12.             return y;
  13.         }
  14.     }
复制代码
公有类不应该直接暴露数据域,如果类是包级私有的,或是私有的嵌套类,可以直接暴露它的数据域。如果公有类想暴露它的数据域怎么办?可以将数据域设置为不可变的,如下例:
  1. public class Time {
  2.     private static final int HOURS_PER_DAY = 24;
  3.     private static final int MINUTES_PER_HOUR = 60;
  4.     public final int hour;
  5.     public final int minute;
  6.     public Time(int hour, int minute) {
  7.         if (hour < 0 || hour >= HOURS_PER_DAY) {
  8.             throw new IllegalArgumentException("Hour: " + hour);
  9.         }
  10.         if (minute < 0 || minute >= MINUTES_PER_HOUR) {
  11.             throw new IllegalArgumentException("Min: " + minute);
  12.         }
  13.         this.hour = hour;
  14.         this.minute = minute;
  15.     }
  16. }
复制代码
这个类确保了每个实例都表示一个有效时间。
三、总结

简而言之,公有类永远都不应该暴露可变的域。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4