关于java:Effective-Java第16条要在仅有类中使用访问方法而非公有域

38次阅读

共计 889 个字符,预计需要花费 3 分钟才能阅读完成。

《Effective Java》第 16 条:要在仅有类中应用拜访办法而非公有域

一、问题

有时候咱们须要定义一些类用来集中实例域(Java 对象中的数据)。常常咱们会把这些数据域申明为 public,能够被间接拜访。这样私有类裸露了它的数据域,有以下两个毛病:

1、要想在未来扭转其外部表示法是不可能的,因为私有类的客户端代码曾经遍布各处了

二、剖析

    class Point {
        public double x;
        public double y;
    }

下面数据域是能够被间接拜访,没有提供封装性能,咱们应该用蕴含公有域和私有办法的类代替

    class Point {
        private double x;
        private double y;

        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }

        public double getX() {return x;}

        public double getY() {return y;}
    }

私有类不应该间接裸露数据域,如果类是包级公有的,或是公有的嵌套类,能够间接裸露它的数据域。如果私有类想裸露它的数据域怎么办?能够将数据域设置为不可变的,如下例:

public class Time {
    private static final int HOURS_PER_DAY = 24;
    private static final int MINUTES_PER_HOUR = 60;

    public final int hour;
    public final int minute;

    public Time(int hour, int minute) {if (hour < 0 || hour >= HOURS_PER_DAY) {throw new IllegalArgumentException("Hour:" + hour);
        }
        if (minute < 0 || minute >= MINUTES_PER_HOUR) {throw new IllegalArgumentException("Min:" + minute);
        }
        this.hour = hour;
        this.minute = minute;
    }
}

这个类确保了每个实例都示意一个无效工夫。

三、总结

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

正文完
 0