0

文字列がAbstractTypeの特定のタイプの実装にそれぞれ適合するかどうかをチェックする静的メソッドを含む抽象クラスがあります。文字列が型に適合する場合、文字列をコンストラクターに渡すことにより、型クラスのオブジェクトが作成されます。

残念ながら、静的な抽象メソッドを定義することは許可されていません。誰かがデザインの代替案をお勧めできますか?

前もって感謝します!

public abstract class AbstractType {

   public abstract static boolean isOfThisType(String str); // not possible

   ...

}

public class TypeA extends AbstractType {

   public static boolean isOfThisType(String str) {
   ...
   }

   ...

}

public class TypeB extends AbstractType {

   public static boolean isOfThisType(String str) {
   ...
   }

   ...

}
4

2 に答える 2

1

ええ、それを静的な方法にしないでください。多形である必要がある場合は、静的にしないでください。

すべてのクラスが静的メソッドを実装するため、すべてのクラスが抽象メソッドの実装をシャドウイングします。抽象クラスのデフォルトの実装を提供し、サブクラスにそれをシャドウイングさせます。

于 2013-03-24T21:34:30.150 に答える
0

SPIは、メソッドを持ち、必要に応じて期待されるタイプを構築できるインターフェースをロードします。

public interface MyType { /* your actual implementation */ }

public interface MyTypeChecker
{
    boolean isType(String value);
    MyType getType(String value);
}

public class MyTypeFactory
{
    public /* static */ MyType getType(String value)
    {
        MyType loaded = null;

        for (MyTypeChecker checker : ServiceLoader.load(MyTypeChecker.class))
        {
            if (checker.isType(value))
            {
                loaded = checker.getType(value);
                break;
            }
        }

        return loaded;
    }
}

staticFactoryの方が便利な傾向がありますが、Factoryがそうであるかどうかはほとんど関係ありません。デザインの残りの部分に応じて、実際にその静的な性質を決定します。個人的にはstatic、コードの結合につながる傾向があるため、可能な限り避けることを好みます。

気になる場合は、サービスがロードされたインスタンスを保存して、将来再利用できるようにすることができます(を呼び出すたびにServiceLoader.load、新しいオブジェクトがインスタンス化されます)。これにより、ファクトリは、定義されたSPIファイルを使用して新しいJARを追加するか、メインJARのSPIファイルに新しいタイプを追加するだけで、新しいタイプに合わせてスケーリングすることもできます。

于 2013-03-24T21:39:02.580 に答える