Java将getter和setter用于数组

时间:2019-03-16 18:08:51

标签: java design-patterns architecture

我想从另一个类中获取这个库存数组。

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_的商品。我该如何实现。

1 个答案:

答案 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数组中的inventorymake a method that returns the Iterator中。并在外部代码中使用此迭代器来迭代inventory元素。

或者您可以使Fileiterable并使用foreach运算符来处理inventory元素。

再次,在设计方法时,请记住mutable/immutable class类型。并且如果可能的话,让您的类保持不变。

此外,也不建议像标准Java sdk类一样命名您的类。稍后将阅读您的代码的人可能会将您的File类与java.io.File类混淆。

您的Stack类也是如此,可以将其与java.util.Stack类混淆。请使用其他更具描述性和唯一性的名称。