我想从另一个类中获取这个库存数组。
public class File {
Object[][] inventory=new Object[50][2];
//Reading file to the inventory array.
}
public class Stack {
//I want to copy inventory array to here
}
假设我有2个不同的类,并且有2个不同的数组。
public class inventory {
Object[][] inventory_=new Object[50][2];
}
public class bag {
Object[][] bag_=new Object[50][2];
}
因此,我想比较库存类的商品与bag类中bag_的商品。我该如何实现。
答案 0 :(得分:0)
从技术上讲,可能有一个getter,它只会将引用返回给私有Object[][] inventory
数组。
但是这种方法被认为是不安全的,因为在这种情况下,外部代码可能会通过修改File
数组状态来更改inventory
类的内部状态。
例如:
class File {
Object[][] inventory=new Object[50][2];
public Object[][] getInventory() {
return inventory;
}
}
在这种情况下,让我们考虑以下示例代码:
class Stack {
private File file;
public Stack(File file) {
this.file = file;
}
void processSomething() {
Object[][] stackInventory = file.getInventory();
}
}
例如,如果您为stackInventory[1][1]
分配了某些内容,则inventory[1][1]
类实例中的File
数组元素也将更改其值。
因此,这不是一种好的设计方法,因为它可能会导致项目中难以捕获的错误。
有两种解决方案。
第一个:在您的吸气剂中防御性地复制阵列。
public Object[][] getInventory() {
Object[][] newInventory = new Object[50][2];
// copy inventory array contents to the newInventory array
return newInventory; // and returning safe copy of the array
}
在这种情况下,因为有了对象,如果它们是mutable ones,仍然可以更改对象的内部状态。
要么使对象不可变,要么在创建数组的防御性副本时employ deep copy approach。
建议使用另一种解决此问题的方法是使用Iterator方法。
在File
数组中的inventory
类make a method that returns the Iterator中。并在外部代码中使用此迭代器来迭代inventory
元素。
或者您可以使File
类iterable并使用foreach
运算符来处理inventory
元素。
再次,在设计方法时,请记住mutable/immutable class类型。并且如果可能的话,让您的类保持不变。
此外,也不建议像标准Java sdk类一样命名您的类。稍后将阅读您的代码的人可能会将您的File
类与java.io.File
类混淆。
您的Stack
类也是如此,可以将其与java.util.Stack
类混淆。请使用其他更具描述性和唯一性的名称。