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

时间:2013-03-24 21:30:32

标签: java inheritance static abstract

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

   ...

}

2 个答案:

答案 0 :(得分:1)

是的,不要将其作为静态方法。如果需要多态,请不要将其设置为静态。

由于所有类都将实现静态方法,因此每个类都会影响抽象方法的实现。提供抽象类的默认实现,让子类遮蔽它。

答案 1 :(得分: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;
    }
}

工厂是否static在很大程度上是无关紧要的,尽管它往往更方便。取决于设计的其余部分,确实决定了它的静态性质。就个人而言,我更愿意尽可能避免使用static因为它往往会导致代码耦合。

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