当填写类范围(静态)数据结构/集合(在本例中为2D数组)的值时,通常最好将值直接保存到静态值中,还是应该创建临时变量在方法?
更清楚地说明:
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 :(得分:1)
首先,重要的是要注意这两种方法都不是线程安全的。如果您的应用程序是多线程的,或者更准确地说,同时访问MyClass
个对象,则需要额外的预防措施。甚至引用类型的赋值也不保证是原子的。
在顺序程序中,在临时构建新值并且在完成此操作后仅覆盖旧引用在某些方面可能更安全。最重要的是,考虑如果填充新表的逻辑抛出一个从setTable
方法中逃脱的异常会发生什么。如果您的程序设法从该错误中恢复,则第一个实现将留下未定义状态MyClass.table
,而第二个实现将保持不变。因此,如果流程可能因您计划从中恢复而出现故障,则可能需要使用第二个实现。 (在C ++中,我们说提供这种“提交或回滚”语义的操作提供了强大的异常保证但是到目前为止我还没有看到Java社区中使用过的这个术语。)< / p>
最后,您可能有兴趣听到
Object obj = new Object();
不保证仅在完全构造新对象之后才进行赋值。如果这对您来说很重要,请将构造移动到方法中,因为从方法(而不是构造函数)返回会建立“之前发生”关系。 (如上所述,赋值仍然不是原子的。)
我假设您了解使用可变静态字段的含义。只是说可能有更好的方法来做你想做的事。