不使用继承正确设计的属性吗?在序列化中造成麻烦。 Java

Is making no attribute using inheritance proper design? Causing trouble in Serialization. Java

我是编程新手,一周前刚学会继承,有一个问题是如何设计适当的 class 来扩展其他 class。 下面的代码是将所有银行帐户对象存储到 ArrayList 中的 Bank Class,这就是为什么我要扩展 class ArrayList 在银行 class。

问题 1:Bank class 属性是 ArrayList。这就是为什么我在构造函数中调用 super() 的原因。由于 Bank class 扩展了 ArrayList,因此可以通过调用 super() 创建属性,我认为除了我通过调用 super() 创建的属性外,bank 中不需要其他私有属性。这是继承的正确方法吗?

问题2:由于没有属性,所以卡在了通过ObjectOuputStream序列化上。我想写 ArrayList(我通过在构造函数中执行 super() 创建的属性),但不能,因为我不知道如何引用我在超级构造函数中创建的 ArrayList 属性。我尝试了 writeObject(this),但显然没有效果。 如何序列化ArrayList?

问题 3:如果这是实现 Bank 继承的正确方法 class,如何从 ObjectInputStream 加载 ArrayList?因为没有属性,我不知道如何引用我在super()中制作的属性,所以我做了这样的事情

this = (ArrayList)ois.readObject()

但是它没有用...当没有属性时,如何使用反序列化加载 ArrayList?

public class Bank extends ArrayList<Account> implements Serializable{
    //no attribute

    public Bank(){
        super();
    }

    //other methods...

    public void saveToBinary() throws IOException{
        FileOutputStream fos = new FileOutputStream("Bank_Account_Inherit_Binary.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(this);//can't do this
        oos.flush();
        oos.close();
    }

    public void loadFromBinary() throws IOException, ClassNotFoundException{
        FileInputStream fis = new FileInputStream("Bank_Account_Inherit_Binary.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Object object = ois.readObject();
        this = (ArrayList<Account>)object;//not working b/c "this" is final variable
    }
}

关于问题1,最好说BankHAS-AArrayList,而不是BankIS-AArrayList。如果扩展 ArrayList,则允许外部 classes 修改 ArrayList 的内容。通常,当您想要扩展 object 提供的功能时,您会扩展 object。当您想使用 object 的方法和功能来完成您的 class 执行的任务时,将使用封装。您应该使用封装并维护一个包含帐户列表的私有实例变量:

public class Bank {
    private ArrayList<Account> accounts;

    public Bank() {
        accounts = new ArrayList<Account>();
    }

    other methods...
}

如果你想允许客户访问和修改账户列表,你可以写一个getter和setter。

如果你有账户列表的私有实例,问题2的解决方案很简单,你现在可以将ArrayList传递给ObjectOutputStream。如果你想引用 ArrayList superclass,你可以将 this object 转换为正确的类型:(ArrayList) this,但这对于序列化来说应该不是必需的。我认为您遇到的问题是帐户 class 不可序列化,请确保在 class header 中您说 class 帐户实现序列化。