2011-04-14 49 views
1

考慮以下兩個類(一個是Mainmain()法):字符串[]指着在VO相同的參考對象

的VO類:

public class TheVO { 
    private String[] theValues = null; 
    /** 
    * 
    */ 
    public TheVO(String[] theParam) { 
     this.theValues = theParam; 
    } 

    /** 
    * 
    * @return 
    */ 
    public String[] getValues(){ 
     return this.theValues; 
    } 

    @Override 
    public String toString() { 
     StringBuffer buf = new StringBuffer(""); 
     if(this.theValues == null){ 
      return buf.toString(); 
     } 
     for(String read:this.theValues){ 
      buf.append(read); 
      buf.append(" "); 
     } 
     return buf.toString().trim(); 
    } 
} 

主分類:

執行後
public class Main { 
    /** 
    * 
    */ 
    public Main() { 
     super(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     TheVO theV = new TheVO(new String[]{"Hello","World!!"}); 
     String[] vale = theV.getValues(); 
     vale[0] = "Goodbye"; 
     System.out.println(theV); 
    } 
} 

結果:

再見世界!

問:

我知道vale數組變量是指在構造函數解析相同的變量,如果我改變的指標之一陣列中的它在VO改變同樣String[]

如何「修理」或更改TheVO類,這樣我的結果是?:

的Hello World!

回答

1

您可以嘗試更改getValues();方法返回TheVO.theValues數組的副本,而不是對原始數組的引用。

2

您需要使用防禦性複製:在構造函數中複製String[]。這確保參數在傳遞到VO類後不會被修改。然後在吸氣劑中複製String[]以避免吸氣劑的調用者修改您的內部String[]。複製一個arrray最簡單的方法是調用clone

this.theValues = theParam.clone(); 

如果您使用的集合,而不是你可以擺脫,吸附劑中的防守副本的陣列,通過包裝使用Collections.unmodifiableList(),而不是(這是一個便宜很多您的收藏操作):

private List<String> theValues; 

public List<String> getValues(){ 
     return Collections.unmodifiableList(this.theValues); 
} 

雖然你仍然需要構造函數中的防禦副本。

+0

我不不想訴諸使用清單。仍想返回字符串[]。 – Koekiebox 2011-04-14 09:45:23

+1

然後你需要做防禦性的副本。 – 2011-04-14 09:46:05

1

您可以在getValues()方法中複製(或克隆)您的String []。

這樣,通過創建新數組,您將失去字符串數組之間的耦合。

1

我會建議在從TheVO.getValues()返回時執行內部數組的副本。如果您在Java 1.6上運行,則可以利用Arrays.copyOf()方法。

public String[] getValues() { 
    return Arrays.copyOf(theValues, theValues.length); 
} 

注意,沒有必要爲了這裏訪問的實例字段使用this

1

在VO構造函數創建數組的副本

+0

如果你的意思是克隆()。不起作用。實例變量設置爲克隆,並且該克隆也在Main類中設置。看來迄今爲止唯一可行的是getValues()方法中的clone()。 – Koekiebox 2011-04-14 09:42:21

+0

否 - 不克隆 - System.arrayCopy() - 不能記住我頭頂部的參數,但它需要源數組的副本,而不是其參考的副本。 – DaveH 2011-04-14 10:01:59

+1

'System.arraycopy()'確實是複製數組的首選/唯一1.6之前的方式。有關更多詳細信息,請參閱http://download.oracle.com/javase/6/docs/api/java/lang/System.html上的API文檔。 – 2011-04-14 10:07:15

1

變化的GetValues()方法來克隆陣列...

事情是這樣的......

public String[] getValues(){ 
    return this.theValues.clone(); 
}