gpt4 book ai didi

java - 在 Java 中创建类范围的数组

转载 作者:行者123 更新时间:2023-12-01 12:27:51 24 4
gpt4 key购买 nike

填充类范围(静态)数据结构/集合(在本例中为二维数组)的值时,通常是将值直接保存到静态结构/集合中更好,还是应该创建一个临时变量在方法中?

为了更清楚地说明:

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;
}
}

创建临时变量在这里感觉多余且无用。但在某些情况下会建议这样做吗?程序有可能在方法执行过程中崩溃并损坏数据吗?多线程应用程序?

我希望这个问题不是主观的,只是想知道直接填写是否存在本质上的问题。

最佳答案

首先,需要注意的是,这两种方法都不是线程安全的。如果您的应用程序是多线程的,或者更准确地说,并发访问 MyClass 对象,则需要额外的预防措施。即使引用类型的赋值也不能保证是原子的。

在顺序程序中,临时构建新值并且仅在完成后覆盖旧引用在某些方面可能更安全。最重要的是,考虑如果填充新表的逻辑抛出从 setTable 方法中转义的异常,会发生什么情况。如果您的程序设法从该错误中恢复,第一个实现将留下 MyClass.table 的未定义状态,而第二个实现将使其保持不变。因此,如果该过程可能因您计划恢复的错误而失败,那么您可能需要采用第二种实现。 (在 C++ 中,我们说提供这种“提交或回滚”语义的操作提供了强大的异常保证,但到目前为止我还没有在 Java 社区中看到这个术语。)

最后,您可能有兴趣听听

Object obj = new Object();

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

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

关于java - 在 Java 中创建类范围的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com