2014-10-04 46 views
0

在填充類(靜態)數據結構/集合(在本例中爲二維數組)的值時,通常最好將值直接保存到靜態數組中,或者應該在方法中創建一個臨時變量?在Java中創建類的數組

爲了更清楚:

public class MyClass{ 

    private static int[][] table; 

    public void setTable(int row, int col){ 

     table = new char[row][col]; 
     // fill table (eg. table[i][j] = 5;) 
    } 


    //// OR THIS////// 

    public void setTable(int row, int col){ 

     int[][] tempTable = new tempTable[row][col]; 

     // fill tempTable 
     table = tempTable; 
    } 
} 

創建一個臨時變量感覺多餘無用這裏。但是有沒有這種情況會被告知?通過執行方法和破壞數據中途程序崩潰的可能性?多線程應用程序?

我希望問題不是主觀的,只是想知道是否存在固有的問題,直接填寫。

+0

如果靜態對象可以/應該改變,那麼第一種方法是好的。我更喜歡這是因爲清晰度,但這是由於我的偏好,而不是任何技術優勢。但是如果你想讓它保持不可修改的狀態,那麼你應該使它成爲static final int [] [] table = setTable(int,int)',並使用第二種方法。 – 2014-10-04 02:57:17

回答

1

首先,重要的是要注意兩種方法都不是線程安全的。如果您的應用程序是多線程的,或者更確切地說,MyClass對象可以同時訪問,則需要額外的預防措施。即使參考類型的分配也不能保證是原子的。

在順序程序中,在臨時構建新值並且只有在完成此操作後才覆蓋舊的參考可以在某些方面更安全。最重要的是,考慮如果填充新表的邏輯拋出一個從setTable方法轉義的異常,會發生什麼情況。如果您的程序設法從該錯誤中恢復,則第一個實現將會留下未定義的MyClass.table狀態,而第二個將使其保持不變。因此,如果可能由於您計劃從中恢復的錯誤導致進程失敗,那麼您可能需要執行第二個實施。 (在C++中,我們說一個提供這種「提交或回滾」語義的操作提供了一個強壯的異常保證,但我迄今尚未在Java社區中看到該術語。)

最後,您可能有興趣聽到這種說法

Object obj = new Object(); 

不保證只在新對象完全構建後才進行賦值。如果這可能對你很重要,將構造移到一個方法中,因爲從方法返回(而不是構造函數)會建立一個「發生在之前」的關係。 (如上所述,作業仍然不是原子的。)

我假定您知道使用可變靜態字段的含義。只是說有可能有更好的方法來做你想做的事。