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