2013-10-27 40 views
-1

我是Java的新成員,對於在Java中返回一個數組感到困惑。 下面是我的代碼:Java中返回一個數組是否安全?

public class Pointer{ 
    private final int[] data; 
    Pointer(){ 
     data = new int[4]; 
     data[0] = 1; 
     data[1] = 2; 
     data[2] = 3; 
     data[3] = 4; 
    } 
    public int[] test(){ 
     return data; 
    } 
    public void print(){ 
     int length = data.length; 
     int j; 
     for(j = 0; j < length; j++){ 
      System.out.println(data[j]); 
     } 
    } 
    static public void main(String[] argv){ 
     Pointer i = new Pointer(); 
     int[] re = i.test(); 
     i.print(); 
     re[2] = 1; 
     i.print(); 
    } 
} 

我雖然我返回一個int數組,而不是指針指向,所以當我重新寫了[2] = 1。如何使這個數據不應該被改變指針對象不可變?

+1

相關:[如何在Java中創建不可變對象?](http://stackoverflow.com/questions/6305752/ how-to-create-immutable-objects-in-java) –

+3

你有沒有搜索過它? http://stackoverflow.com/questions/10339930/final-array-in-java或http://stackoverflow.com/questions/3737769/java-unmodifiable-array – Christian

+1

是的,你不能在Java中返回一個數組,只有對它的引用被返回。如果你想返回一個不是原始引用的數組,你必須創建一個副本或做別人建議的內容。 – Radiodef

回答

0

數組是Java中的對象,對象是通過引用傳遞的(即使引用是按值傳遞的)。

您無法通過值傳遞數組本身。

你可以做的是取而代之返回一個拷貝的數組。這種方式改變返回的數組不會影響Pointer內部的數組(如果這是你想要的行爲)。

public int[] test(){ 
    return data.clone(); 
} 
2

首先,來看看這個documentation在喬希布洛赫的優秀圖書有效的Java不可改變類的篇章。我知道這個網站看起來像是在1997年製作的,但不要讓這些打擾你。信息很好。

爲了使您的類不可變,您不能允許在可變的私有數據上使用增變器方法(即setter)訪問器(即getter)。這會否定private-併產生漏洞抽象。

您發現了後者的一個實例。你通過getter暴露的數組是可變的。這會讓你的類變得可變。沒有辦法讓數組不可變。

您有選擇。這裏有一些:

  • 在你的getter中,返回類中數組的副本。
  • 沒有getter,但允許像getValue(int index)這樣的在給定索引處檢索數組值的東西(如果索引超出範圍,則會使用錯誤處理,如IllegalArgumentException)。
  • 在你的getter中,返回一個由數組構造的不可變集合,如Collections.unmodifiableList(Arrays.asList(data));。有關文檔,請參閱here
0

返回數組的唯一情況是安全的,當數組爲空時。否則,我們需要返回一份副本。有2種方法來創建副本1)arr.clone()2)Arrays.copyOf()

相關問題