2016-11-22 23 views
2

建議最終(不可變)java類中的數據字段具有公共訪問修飾符,即使數據字段不是對可變數據類型的引用或者我們是否應該訪問數據字段直接作爲數據字段應該在構造函數本身中定義,從而使所有改變類的內部表示的機會無效。 請建議?與不可變類一起使用時訪問Java中的修飾符

例如:

public class MainApp { 

    public static void main(String args[]) { 

     Immutablesample immutablesample = Immutablesample.getInstance("akkhil"); 

     System.out.println(" Before modification " + immutablesample.getName()); 
     immutablesample.name = "gupta"; 
     System.out.println(" After modification " + immutablesample.getName()); 
    } 

} 

是調用代碼試圖通過直接訪問它(沒有訪問修飾符)爲下面的類來改變數據字段:

public final class Immutablesample { 


    private final String name; 

    private Immutablesample(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public static Immutablesample getInstance(String name){ 
     return new Immutablesample(name); 
    } 
} 

它會如何做如果我將修改器從私有變爲公有private String name;公共字符串名稱; 由於對象是使用參數化構造函數創建的,因此具有不可變數據字段,爲什麼需要將數據字段設置爲私有?

+1

你可以發表一個或兩個例子嗎?由於缺乏標點符號和適當的術語,很難理解這個問題。 –

+0

你可以在這裏找到所有的細節:https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html – grsdev7

+0

編號數據字段應始終是私人的和最終的。只提供獲得者(如果需要,可以返回可變實例的防禦副本) – TheLostMind

回答

2

兩個簡單的規律可循:

  1. 儘量讓全班爲「不可改變的」,你可以。例如,只能通過構造函數設置私有最終字段。當使用「傳入」收集對象時,請考慮創建一個副本的內容,以確保安全。
  2. 請記住,良好的OO是關於暴露行爲;而不是暴露數據。含義:你絕對要做而不是想公開領域,除非你有充分的理由這樣做。換句話說:你做而不是希望其他一些B類因某些A類領域的內容而做某些事情。而要避免這種情況的方法是:讓你的領域變得私人化!
1

一般來說,顯示一個類的內部表現是一個不好的決定,所以如果隱藏甚至是最終的不可變字段會好得多。如果你的類是一個元組,那麼你只能顯示字段,其中所有成員都是從外部使用的。