Effective Java笔记(16)要在公有类而非公有域中使用访问方法

这篇具有很好参考价值的文章主要介绍了Effective Java笔记(16)要在公有类而非公有域中使用访问方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        有时候,可能需要编写一些退化类,它们没有什么作用,只是用来集中实例域 :

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

        由于这种类的数据域是可以被直接访问的,这些类没有提供封装( encapsulation )的功能。 如果不改变 API,就无法改变它的数据表示法, 也无法强加任何约束条件;当域被访问的时候,无法采取任何辅助的行动 。 坚持面向对象编程的程序员对这种类深恶痛绝,认为应该用包含私有域和公有访问方法( getter ) 的类代替 。 对于可变的类来说,应该用公有设值方法( setter )的类代替 :

class Point {
    private double x;
    private double y;
    pub1ic Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public double getX() { return x; }
    public double getY() { return y; }
    public void setX(double x) { this.x = X; }
    public void setY(double y) { this.y = y; }
}

        毫无疑问,说到公有类的时候,坚持面向对象编程思想的看法是正确的 : 如果类可以在它所在的包之外进行访问,就提供访问方法,以保留将来改变该类的内部表示法的灵活性 。如果公有类暴露了它的数据域 ,要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各处了 。

        然而 , 如果类是包级私有的,或者是私有的嵌套类, 直接暴露它的数据域并没有本质的错误——假设这些数据域确实描述了该类所提供的抽象 。 无论是在类定义中,还是在使用该类的客户端代码中,这种方法比访问方法的做法更不容易产生视觉混乱 。 虽然客户端代码与该类的内部表示法紧密相连,但是这些代码被限定在包含该类的包中 。 如有必要,也可以不改变包之外的任何代码,而只改变内部数据表示法 。 在私有嵌套类的情况下,改变的作用范围被进一步限制在外围类中 。

        让公有类直接暴露域虽然从来都不是种好办法,但是如果域是不可变的,这种做法的危害就比较小一些 。 如果不改变类的 API ,就无法改变这种类的表示法,当域被读取的时候,你也无法采取辅助的行动,但是可以强加约束条件 。 例如,这个类确保了每个实例都表示一个有效的时间:

public final 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;
    }
    ... // Remainder omitted
}

        简而言之,公有类永远都不应该暴露可变的域 。 虽然还是有问题,但是让公有类暴露不可变的域,其危害相对来说比较小 。 但有时候会需要用包级私有的或者私有的嵌套类来暴露域,无论这个类是可变的还是不可变的 。文章来源地址https://www.toymoban.com/news/detail-576803.html

到了这里,关于Effective Java笔记(16)要在公有类而非公有域中使用访问方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Effective Java笔记(6)避免创建不必要的对象

            一般来说,最好能重用单个对象,而不是在每次需要 的时候就创建一个相同功能的新对象 。 重用方式既快速,又流行 。 如果对象是不可变的( immutable ) (详见第 17 条),它就始终可以被重用 。         作为一个极端的反面例子,看看下面的语句 :    

    2024年02月15日
    浏览(25)
  • Effective Java笔记(11)覆盖 equals 时总要覆盖 hashCode

             在每个 覆盖了 equals 方法的类中,都 必须 覆盖 hashCode 方法 。 如果不这样做的话,就会违反 hashCode 的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这类集合包括 HashMap 和 HashSet 。 下面是约定的内容,摘自 Object 规范: 1、在应用程序的执

    2024年02月15日
    浏览(44)
  • Effective Java笔记(3)用私有构造器或者枚举类型强化 Singleton 属性

            Singleton 是指仅仅被实例化一次的类 。Singleton 通常被用来代表一个无状态的对象,如函数,或者那些本质上唯一的系统组件 。 使类成为 Singleton会使它的害户端测试变得十分困难 ,因为不可能给 Singleton 替换模拟实现,除非实现一个充当其类型的接口 。      

    2024年02月15日
    浏览(40)
  • Effective Java笔记(9)try-with-resources 优先于 try -finally

            Java 类库中包括许多必须通过调用 close 方法来手工关闭的资源 。 例如 InputStream 、OutputStream 和 java.sql.Connection 。 客户端经常会忽略资源 的关闭 ,造成严重的性能后果也就可想而知了 。 虽然这其中的许多资源都是用终结方法作为安全网,但是效果并不理想。  

    2024年02月15日
    浏览(39)
  • 如果一定要在C++和JAVA中选择,是C++还是java?

    前言 C++和Java都是广泛应用于软件开发领域的高级编程语言。它们都有着各自的优势和适用场景,因此在进行选择时需要考虑到具体的需求和使用情况。 首先,C++是一种面向对象的编程语言,它允许程序员直接控制计算机硬件,而且拥有较低的底层抽象层次,可以更好地进行

    2024年02月05日
    浏览(79)
  • 【Java学习笔记】16.Java 格式化输出 printf 用法

    Java 格式化输出 printf 用法 Java 中的 printf 方法用于格式化输出。 格式化指定了输出的形式,包括数字的精度、字符宽度、日期格式等等。下面是一些常用的格式化符号和用法: 字符串格式化 %s : 输出字符串 实例 整数格式化 %d : 输出十进制整数 %o : 输出八进制整数 %x : 输出十

    2024年02月07日
    浏览(34)
  • effective c++ 笔记

    TODO:还没看太懂的篇章 item25 item35 模板相关内容 可以将C++视为以下4种次语言的结合体: C 面向对象 模板 STL 每个次语言都有自己的规范,因此当从其中一个切换到另一个时,一些习惯或守则是可能会发生变化的。 用const替换#define有以下2个原因: #define定义的符号名称可能没

    2024年02月10日
    浏览(21)
  • C++笔记-effective stl

    熟悉stl本身 慎重选择stl容器,每一种stl容器对应不同的使用场景,比如deque往往比vector更加合适 封装stl容器,积极的使用stl,可以高效的使用它 积极使用其对应迭代器使用的函数,比如做相加运算使用accumulate替代for循环,可以更加高效 调用对应的函数的时候,不使用过于复

    2024年01月18日
    浏览(30)
  • effective c++ 笔记 条款18-25

    使用外覆类型(wrapper)提醒调用者传参错误检查,将参数的附加条件限制在类型本身 三个参数类型相同的函数容易造成误用 导入新的类型 限制取值 从语法层面限制调用者不能做的事 operate*的返回类型上加上const修饰,防止无意的错误赋值if (a * b = c) 接口应表现出与内置类型

    2024年02月21日
    浏览(35)
  • More Effective C++学习笔记(1)

    在任何情况下都 不能使用指向空值的引用 。一个引用必须总是指向某个对象,必须有初值。 如果变量指向 可修改,且有可能指向null ,就把变量设为 指针 ;如果变量 总是必须代表一个对象(不可能为null) ,就把变量设为 引用 。 引用可能比指针更高效 ,因为不必像指针

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包