0

私は、調査からの生のスコアを特定のカテゴリのパーセンタイル値に変換するメソッドを宣言するインターフェースを念頭に置いています。カテゴリは、関連のない複数の列挙型によって記述されます。だから私はこれから始めました:

public interface NormTable<E extends Enum<E>> {
    Integer percentileForRawScore(E e, int score);
}

次に、たとえば Foo 調査とそのSubscale列挙型の実装クラスを取得しました。

public class FooSubscaleNormTable implements NormTable<Subscale> {
    public Integer percentileForRawScore(Subscale e, int score) {
        // Implementation
    }
}

最後に、適切な具象クラスを作成するためのファクトリ クラス:

public class NormTableFactory {
    public static <E extends Enum<E>> NormTable<E> normTableForSurveyAndType(
        String surveyCode, Class<E> clazz) {
    if ("Foo".equals(surveyCode) && Subscale.class.equals(clazz)) {
        return (NormTable<E>) new FooSubscaleNormTable();
    } else {
            // ...
        }
    }
}

Eclipse が未チェックのフラグを立てているため、キャストが間違っているのではないかと思いますが、続行できます。ただし、ビルド サーバー上の Java 1.6 コンパイラはまったく問題なく、変換できない型としてフラグを立てます。

ファクトリ クラスのシグネチャが間違っているのでしょうか、それともアーキテクチャ全体が怪しいのでしょうか? 上記の列挙型は「そうでなければ無関係」ですが、それらはすべて調査内のカテゴリを表し、おそらくそれらの型を統一するためのインターフェースを実装できることに注意してください。それは役に立ちますか?

4

1 に答える 1

2

宣言型で具体的な Enum クラスを使用しないでください。

FooSubscaleNormTable もジェネリックにする

public class FooSubscaleNormTable<E extends Enum<E>> implements NormTable<E> {
    public Integer percentileForRawScore(E e, int score) {
       if(e instanceof Subscale) {
           switch((Subscale) e) {
           case X:
           // do something
           break;
           }
       }
       // return 0; 
    }
}

工場を次のように変更します

public class NormTableFactory {
    public static <E extends Enum<E>> NormTable<E> normTableForSurveyAndType(
        String surveyCode, Class<E> clazz) {
    if ("Foo".equals(surveyCode) && Subscale.class.equals(clazz)) {
        return (NormTable<E>) new FooSubscaleNormTable<E>();
    } else {
            // whatever else
        }
    }
}

次に、それを呼び出すとき、つまり、目的の列挙型を渡すときです。

NormTable<Subscale> scale = NormTableFactory.normTableForSurveyAndType("surveyCode", Subscale.class);
于 2012-05-27T07:58:02.173 に答える