Chapter4 Item14 在公有類中使用訪問方法而不是公有域

你可能偶爾需要編寫退化類,目的只是為了集中實例域:

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

標準寫法是:

// Encapsulation of data by accessor 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類暴露了其數據域,則要想在將來改變內部表示是不可能的,因為他的客戶端代碼可能已經遍布各處了。
然而,如果類是package-private或是private嵌套類,那么把數據域暴露出去并沒有本質的錯誤——假設這些數據域充分描述了該類提供的抽象。無論是在類定義中,還是在客戶端代碼中,這種方法相對于訪問方法更不會產生視覺混亂。雖然客戶端代碼與類的內部表示緊密相連,但這些代碼被限定在同一個包中。如果需要改變內部數據表示,你不必修改包外的任何代碼。如果是private嵌套類,則甚至不需要修改類外的任何代碼。

除非修改其API,否則你不能修改其內部數據表示,而且當別人讀取該字段時 你不能采取任何附加行動,但是你可以強加約束條件(——因為只有你自己可以set該字段)
補救辦法: public域加入約束條件

// public class with exposed immutable fields - questionable  
public final class Time {  
  private static final int HOUR_PER_DAY = 24;  
  private static final int MINUTES_PER_HOUR = 60;  
  
  public final int hour;  
  public final int minute;  
  
  public Time() {  
    //強加約束條件  
    if (hour < 0 || hour >= HOUR_PER_DAY) {  
       throw new IllegalArgumentException();  
    if (minute < 0 || minute >= MINUTES_PER_HOUR) {  
       throw new IllegalArgumentException();  
      
    this.hour = hour;  
    this.minute = minute;  
  }  
  
}

Summary

public類永遠不要暴露其可變的字段。而public類暴露其不可變字段雖然是有問題,但危害性要小一些。然而,package-private或者private的嵌套類暴露其字段則是可行的,無論該字段是可變還是非可變。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 前言 人生苦多,快來 Kotlin ,快速學習Kotlin! 什么是Kotlin? Kotlin 是種靜態類型編程...
    任半生囂狂閱讀 26,276評論 9 118
  • 不知道你最近怎么樣,莫名想你 。 說實話,我現在也不是很好 此前一個月,什么也沒做,毫無長進。虛度了時光,浪費大好...
    泠弋閱讀 340評論 0 0
  • 轉載請注明出處,感謝您的支持。同時,歡迎加入移動開發學習交流qq群 : 450302004,互相學習。文章來源:【...
    chenyk閱讀 538評論 0 11