Java 设计-替代不允许的抽象静态方法

Java 设计-替代不允许的抽象静态方法,java,inheritance,static,abstract,Java,Inheritance,Static,Abstract,我有一个抽象类,它包含一个静态方法来检查字符串是否适合AbstractType的特定类型。如果字符串适合某个类型,则将通过将字符串传递给构造函数来创建类型类的对象 不幸的是,不允许定义静态的抽象方法。有人能推荐一种设计方案吗 提前谢谢 public abstract class AbstractType { public abstract static boolean isOfThisType(String str); // not possible ... } public

我有一个抽象类,它包含一个静态方法来检查字符串是否适合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) {
   ...
   }

   ...

}

是的,不要把它当作静态方法。如果它需要是多态的,不要让它是静态的

由于您的所有类都将实现静态方法,因此每个类都会影响抽象方法的实现。为抽象类提供一个默认实现,并让子类对其进行隐藏。

加载一个具有该方法的接口,该接口可以按需构建所需的类型

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;
    }
}
工厂是否是静态的,在很大程度上是无关紧要的,尽管它更方便。取决于设计的其他部分,它真正决定了它的静态性质。就我个人而言,我倾向于尽可能避免
静态
,因为这会导致代码耦合

如果您愿意,那么您可以存储服务加载的实例以供将来重用(每次调用
ServiceLoader.load
都会实例化一个新对象)。这还允许工厂通过简单地添加一个带有已定义SPI文件的新JAR,或将新类型添加到主JAR中的SPI文件中,来扩展新类型