存储实际的类逻辑/蓝图并再次加载它

时间:2012-12-18 14:40:05

标签: java serializable objectoutputstream objectinputstream

如果我有这样的课程:

class Foo implements HasBarMethod {
  public double bar(double x) {
    return x*x;
  }
}

现在我有了

Foo foo = new Foo();
someObjectOutputStreamToSomeFile.writeObject(foo);

执行。后来我决定改变Foo的定义,如下:

class Foo implements HasBarMethod {
  public double bar(double x) {
    return x+x;
  }
}

是否可以这样做:

HasBarMethod foo = (HasBarMethod)someObjectInputStreamFromSameFile.readObject();

HasBarMethod没有改变。现在我想从foo.bar(x)得到x的平方,而不是总和。这可能吗?

当然,我应该使用不同的名称制作不同的类Foo1,Foo2,...作为一种好习惯。如果我正在制作一个包含各种博客的网站,我会的。但鉴于我正在做实验性的东西(很多数字和很多方法来解释它们),不必深入研究编写一个巨大的类继承结构的细节,因为不同的Foo类只会有很小的适应性

2 个答案:

答案 0 :(得分:1)

Java序列化保存字段。方法的说明保存在类文件中。

也许看看保存不同的类文件和不同的类加载器,或者使用字节代码库来根据输入文件进行小的更改,尽管两者都可能比为不同的行为设置不同的类更复杂

答案 1 :(得分:1)

如果我的问题是正确的,那么您希望实现一个行为根据情况动态变化的类。您可以实现一种常见模式(抱歉,不记得它的名字):

//create function objects
class Sum implements HasBarMethod{
    public double bar(double x) {
        return x+x;
    }
}

class Multiply implements HasBarMethod{
    public double bar(double x) {
        return x*x;
    }
}

//create the base class
class DynamicBehavior{
    private HasBarMethod strategy;
    //other class fields

    public DynamicBehavior(HasBarMethod strategy){
        this.strategy = strategy;
        // ...
    }

    public double bar(double x) {
        return strategy.bar(x);
    }

    //you may want to handle strategy change in a different way.
    //this here is just a simple example.
    public setStrategy(HasBarMethod strategy){
        this.strategy = strategy;
    }

    //any code implementing strategy changes or whatever
}

这将允许您根据其状态或您可能希望考虑的任何其他条件更改您的课程使用的策略。

其用法示例:

public static void main(String args[]){
    HasBarMethod defaultStrategy = new Sum();
    DynamicBehavior dyn = new DynamicBehavior(defaultStrategy);


    if( /*condition*/ ){
        dyn.setStrategy(new Multiply());
    }

    double result = dyn.bar(5);
}

您可能还希望将策略函数对象转换为基类的静态字段,因为每次您决定切换策略时,都可以通过避免创建新实例来节省一些内存和时间。