2

このようなクラスがある場合:

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 の 2 乗を取得したいと考えています。これは可能ですか?

もちろん、良い習慣として、異なる名前で異なるクラス Foo1、Foo2、... を作成する必要があります。そして、さまざまな種類のブログでウェブサイトを作成している場合はそうします。しかし、私が実験的なこと (多くの数字とそれらを解釈する多くの方法) を行っていることを考えると、異なる Foo クラスが小さな適応がある

4

2 に答える 2

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);
}

ストラテジーを切り替えるたびに新しいインスタンスが作成されないようにすることで、メモリと時間を節約できるため、ストラテジー関数オブジェクトを基本クラスの静的フィールドに変換することをお勧めします。

于 2012-12-18T14:56:03.960 に答える
1

Java シリアライゼーションはフィールドを保存します。メソッドの命令は、クラス ファイルに保存されます。

おそらく、さまざまなクラス ファイルとさまざまなクラス ローダーを保存するか、バイト コード ライブラリを使用して入力ファイルに基づいて小さな変更を加えることを検討してください。

于 2012-12-18T14:48:30.647 に答える