1

共通のコードを共有する一連のクラスA、、、 ... (合計Bで数十個) があります。C各クラスの多くのインスタンスが存在する可能性がありますA, B, C.... Abstract代わりにそのコードを含むスーパークラス を作成する予定です。

問題は、共通のものは、クラスごと (インスタンスごとではなく) で一意のオブジェクトで機能することです。これは現在、対応する値を持つ静的フィールドを持つAB、 ...によって解決されています。C明らかに、機能を にリファクタリングする場合Abstract、これを別のものに変更する必要があります。

実際には、現在、次のようになっています (実際の型は ではないことに注意してくださいString。これは説明のためのものです)。

public class A implements CommonInterface {

    private static final String specificVar = "A";

    @Override
    public void common() {
        specificVar.contains('');
    }
}
public class B implements CommonInterface {

    private static final String specificVar = "B";

    @Override
    public void common() {
        specificVar.contains('');
    }
}

私がこれまでに思いついた最良のアイデアは、Map<Class<? extends Abstract>,K>(関連する型はどこにKあるのか) に静的フィールドをAbstract持ちA、関連する値をマップに配置する静的初期化ブロックをそれぞれに含むことですBCただし、これが最善の方法であるとは確信していません。

私はDIフレームワークを使用していないことに注意してください。

では、サブクラスに含まれるコードに関して、フィールド アクセスの効率を犠牲にすることなく、共通コードによって処理される, , ...の静的フィールドをリファクタリングする最も簡潔な方法は何でしょうか?ABC

4

3 に答える 3

0

おそらく、列挙型が必要です。

enum MyInstances implements MyInterface {
    A {
       fields and methods for A
    }, B {
       fields and methods for B
    };
    common fields for all MyInstances 

    common methods for all MyInstances 
}

// To lookup an instance
MyInstances mi = MyInstances.valueOf("A");
于 2012-08-08T12:05:28.943 に答える
0

ソース コードを表示していないため、静的フィールドの使用が良い設計選択であるか悪い設計選択であるかを実際に判断することはできません。

サブクラスによる静的フィールドの使用が確かに優れた設計上の選択であることを考慮すると、それらにアクセスするためにスーパークラスに共通コードを持つ最初の方法は、サブクラスに実装される抽象メソッドを呼び出すことです。

例:

public abstract class SuperClass {
    public void processCommonLogic() {
        // Common logic

        // Execute specific logic in subclasses
        processSpecificLogic();
    }

    public abstract void processCommonLogic();
}

public class ASubClass extends SuperClass {
    public static int SPECIFIC_SUBCLASS_CONSTANT = 0;

    public void processSpecificLogic() {
        // Specific subclass logic
        doSomethingWith(ASubClass.SPECIFIC_SUBCLASS_CONSTANT);
    }
}
于 2012-08-08T12:10:01.453 に答える
0

Template Method Patternを使用できます。

抽象クラスで抽象メソッドをgetValue()定義し、値が必要な場所で抽象クラス内で使用します。次に、各サブクラスで getValue メソッドを実装し、そのサブクラスの正しい値を返すだけで済みます。

于 2012-08-08T12:10:01.813 に答える