是不是使用继承正确的设计没有属性?在序列化中引起麻烦。 Java的

问题描述 投票:1回答:1

我是编程新手,我刚刚学习了一周前的继承,并且对于如何设计适当的类来扩展其他类有疑问。下面的代码是将所有银行帐户对象存储到ArrayList中的银行类,这就是我在Bank类中扩展类ArrayList的原因。

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

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

问题3:如果这是实现Bank类继承的正确方法,如何从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
    }
}
java oop inheritance serialization objectoutputstream
1个回答
1
投票

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

public class Bank {
    private ArrayList<Account> accounts;

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

    other methods...
}

如果要允许客户端访问和修改帐户列表,可以为其编写getter和setter。

如果您有一个帐户列表的私有实例,问题2的解决方案很简单,您现在可以将ArrayList传递给ObjectOutputStream。如果要引用ArrayList超类,可以将this对象强制转换为正确的类型:(ArrayList) this,但这不是序列化所必需的。我认为您遇到的问题是Account类不可序列化,请确保在类标题中您说类Account实现了Serializable。

© www.soinside.com 2019 - 2024. All rights reserved.