美文网首页
ITEM 16: public 类的成员变量用方法访问,而不是将

ITEM 16: public 类的成员变量用方法访问,而不是将

作者: rabbittttt | 来源:发表于2019-05-18 14:21 被阅读0次

ITEM 16: IN PUBLIC CLASSES, USE ACCESSOR METHODS, NOT PUBLIC FIELDS
  偶尔,您可能会忍不住编写一些退化类,它们除了对实例字段进行分组外,没有其他用途:

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

  因为能直接访问这些类的数据字段,所以这些类不能提供封装的好处(item 15)。您不能在不更改API的情况下更改表示形式,不能强制执行不变量,也不能在访问字段时采取辅助操作。强硬的面向对象程序员认为这样的类是可恶的,应该总是用带有 private 字段和 public 访问方法(getter)的类替换,对于可变类,应该使用mutators (setter):

// 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; }
}

  当然,当涉及到 public 类时,强硬派是正确的:如果一个类在它的包之外是可访问的,那么提供访问器方法来保持更改类内部表示的灵活性。如果一个 public 类公开了它的数据字段,那么更改它的表示形式的所有希望都将落空,因为客户机代码可以分布得非常广泛。
  然而,如果一个类是package-private 的或者是 private 嵌套类,那么公开它的数据字段并没有本质上的错误——假设它们在描述类提供的抽象方面做得足够好。无论在类定义中,还是在使用类定义的客户机代码中,这种方法都比访问器方法生成更少的视觉混乱。虽然客户机代码绑定到类的内部表示,但此代码仅限于包含该类的包。如果需要更改表示形式,则可以在不触及包外部任何代码的情况下进行更改。对于 private 嵌套类,更改的范围进一步限制为封闭类。
  Java平台库中的几个类违反了 public 类不应该直接公开字段的建议。典型的例子包括 java.awt 包中的 Point 和 Dimension类。这些类应该被视为警示反例,而不是要模仿的例子。如 item 67 所述,Dimension 类的内部结构的决定导致了一个严重的性能问题,这个问题今天仍然存在。
  虽然 public 类直接公开字段从来都不是一个好主意,但是如果字段是不可变的,那么危害就会小一些。如果不更改该类的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 
}

  总之,public 类永远不应该公开可变字段。对于 public 类来说,公开不可变字段的危害要小一些,尽管仍然存在疑问。但是,有时需要 package-private 或 private 嵌套类公开字段,无论是可变的还是不可变的。

相关文章

  • ITEM 16: public 类的成员变量用方法访问,而不是将

    ITEM 16: IN PUBLIC CLASSES, USE ACCESSOR METHODS, NOT PUB...

  • day02

    访问权限控制 一.成员访问权限 public–公有成员变量,成员方法,类—-可以被任何类访问(不管是不是在同一个包...

  • Java访问控制符

    类成员访问控制符# private:类成员只能在当前类的内部被访问,用于实现类的封装,将需要隐藏的成员变量和方法用...

  • 06-09、类中成员变量(属性)修饰符:@public@priv

    @public 就是实例变量(成员变量或属性)修饰符 @public 可以在其它类中访问被public修饰的成员变...

  • 类方法和实例方法的区别

    类方法和实例方法 1、类方法是属于整个类,而不属于某个对象。2、类方法只能访问类成员变量,不能访问实例变量,而实例...

  • java修饰符

    java中的类修饰符、成员变量修饰符、方法修饰符。 类修饰符: public(访问控制符),将一个类声明为公共类,...

  • @public、@private、@protected、@pac

    @public 就是实例变量修饰符 @public >可以在其它类中访问被public修饰的成员变量 >也可以在本...

  • C#入门笔记(一)

    0x00 访问修饰符: Public(类默认)Public 访问修饰符允许一个类将其成员变量和成员函数暴露给其他的...

  • self与super

    self访问成员变量 成员变量是定义在类中的变量,它可以被所在类的方法所调用,而局部变量是定义在方法中的变量,当局...

  • java中的修饰符访问权限

    如果没有写就是默认访问权限。 java的类有2种访问权限:public、默认 而方法和变量有4种:public、默...

网友评论

      本文标题:ITEM 16: public 类的成员变量用方法访问,而不是将

      本文链接:https://www.haomeiwen.com/subject/uhktzqtx.html