ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Effective Java---16 在公共类中使用访问方法而不是公共属性

2021-07-23 12:01:29  阅读:196  来源: 互联网

标签:Java hour Effective int double 公共 public minute 属性


前言

Java的特性:抽象、封装、继承、多态;在Java的设计实现中随处可见这些特性;封装在字面意思上来理解就是将多种东西打包在一起,我们看到的是一个整体,对外部屏蔽一些东西,在Java中即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数/方法都是类的成员。

// Degenerate classes like this should not be public!
class Point {
    public double x;
    public double y;
}

存在的问题

上面这种写法除了集中实例属性以外别无用处。由于这些类的数据属性可以被直接访问,除了会存在多线程下的安全问题,还没有必要,既然已经放弃了对属性的值的限制,那还不如将其设置为静态变量,毕竟谁都可以修改,也就和面向对象无关了。

处理方式

安全的写法才是我们应该有的习惯和规范:

// Encapsulation of data by accessor methods and mutators
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 void setX(double x) { this.x = x; }

    public void setY(double y) { this.y = y; }

}

像这样将属性隐藏起来,而对外提供访问的getter/setter方法,如果类是被public修饰的,在包外也能访问,这样处理在一定程度上也保留更改类内部表示的灵活性;如果该类是包级私有的,或者是一个私有的内部类,即使我将类的属性暴露,也可以将影响控制在一定范围内。

Java 平台类库中的几个类违反了公共类不应直接暴露属性的建议。 著名的例子包括 java.awt 包中的 PointDimension 类。 这些类别应该被视为警示性的示例,而不是模仿的例子。 时至今日,暴露 Dimension 的内部结构的决定仍然导致着严重的性能问题。

虽然公共类直接暴露属性并不是一个好主意,但是如果属性是不可变的,那么危害就不那么大了。当一个属性是只读的时候,除了更改类的 API 外,你不能改变类的内部表示形式,也不能采取一些辅助的行为,但是可以加强不变性。例如,下面的例子中保证每个实例表示一个有效的时间:

// Public class with exposed immutable fields - questionable

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
}

总结

总之,公共类不应该暴露可变属性。 公共类暴露不可变属性(final修饰的)的危害虽然仍然存在问题,但其危害较小。 然而,有时需要包级私有或私有内部类来暴露属性,无论此类是否是可变的。

标签:Java,hour,Effective,int,double,公共,public,minute,属性
来源: https://blog.csdn.net/weixin_44212383/article/details/119028481

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有