2015-02-10 60 views
0

我70%确信这是不可能的,但有没有办法确保子类具有特定的构造函数或工厂方法?强制子类具有特定的工厂方法或构造函数

在这种情况下,我想创建一个StringSerializable,要求子类有以下几种方法

  • toString,其将对象到String
  • fromString,它从String获取实例。

很明显,在第一种情况下,我只能使toString为抽象。另一方面,拥有非静止的fromString似乎是有问题的。但是,我无法创建抽象静态方法。我也不认为构造函数是完全合适的。

+0

您可以在构造函数中使用reflection。 – immibis 2015-02-10 00:58:45

+0

@immibis我听说那可能是不安全的,因为有时反射不起作用。 – 2015-02-10 00:59:14

+0

也反射非常缓慢,应该避免在生产代码一般afaik – 2015-02-10 01:00:52

回答

2

你是对的;在编译时无法强制它。你可以在运行时使用各种技巧(比如在测试中使用反射),但这只是关于它。

但问问自己:为什么你想要吗?你不能动态调用一个静态方法或构造函数(除了通过反射),那么如果你有它们,那么你将如何使用那些所需的工厂呢?

如果只是为了保持代码的一致性(这是一件好事!),那么您只需在开发代码库时确保一致性。基础类中的评论可以在这里发挥很大作用,因为可以编写评论和其他“软”技术。

如果您打算在反射中使用工厂,那么可以在测试中使用类似的反射来确保每个子类都具有它需要的位。

另一种选择是创建一个非静态工厂:

public interface FooMaker() { 
    Foo create(String arg); 
} 

...和使用,而不是静态fromString方法。

还有,你有同样的问题“我如何确保每个子类都有一个FooMaker执行?”我再次说,你不应该担心这一点。如果你将FooMaker作为你的代码的“起点”而不是子类,那么这个子类在做什么并不重要;所有重要的是你的FooMaker s给你一个从字符串到Foo s的方法,并且每个Foo都有一个返回字符串的方法。

+0

它基本上只是为了代码一致性。我之前所做的是要求一个非静态工厂,但实际上只是用来引用一个静态工厂。 – 2015-02-10 01:10:50

0

以下代码确保每个子类都需要实现静态方法,如果子类没有实现该方法,则在构造类时会失败,尽可能接近编译时错误,但不能编译时间

抛出的异常是很清楚的,并开始

public abstract class Base { 
    static Functional test; 

    static { 
     if(test == null) { 
     throw new RuntimeException("You need to provide an implementation for the implemntMe method in class base"); 
     } 
    } 

    private interface Functional { 
     Base implementMe(int whatever, boolean anotherParameter); 
    } 

    public static void main(final String[] args) { 

    } 

}

专用接口结构可确保只有lambda表达式可以用来implemen时PROGRAMM将立即失效t为方法

子类必须像这样

public SubClass extends Base { 
    static { 
     test = (int whatever, boolean anotherParameter) -> { 
     Subclass tmp = new Subclass(); 
     //construct object 
     tmp.setWhatever(whatever); 
     return tmp; 
     } 
    } 
} 

lamdas是这样实现的功能接口联方法,它只有一个抽象方法

的接口,你也可以声明在任何其他地方公开使用,并使用匿名内部类 实现它,但我的方式确保程序员必须复制和粘贴代码才能重用它, 或需要从另一个类复制Functional对象

+0

对不起,我不太熟悉静态和内部这种混合类型。我想知道你是否可以证明子类将要做什么? – 2015-02-10 02:59:16

相关问题