2014-10-04 126 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(); 

不保证只在新对象完全构建后才进行赋值。如果这可能对你很重要,将构造移到一个方法中,因为从方法返回(而不是构造函数)会建立一个“发生在之前”的关系。 (如上所述,作业仍然不是原子的。)

我假定您知道使用可变静态字段的含义。只是说有可能有更好的方法来做你想做的事。