写点什么

《Effective Java》第 16 条:要在仅有类中使用访问方法而非公有域

作者:okokabcd
  • 2022 年 8 月 13 日
    山东
  • 本文字数:782 字

    阅读完需:约 3 分钟

《Effective Java》第16条:要在仅有类中使用访问方法而非公有域

《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; }}
复制代码


这个类确保了每个实例都表示一个有效时间。

三、总结

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

发布于: 刚刚阅读数: 3
用户头像

okokabcd

关注

还未添加个人签名 2019.11.15 加入

一年当十年用的Java程序员

评论

发布
暂无评论
《Effective Java》第16条:要在仅有类中使用访问方法而非公有域_Java_okokabcd_InfoQ写作社区