我有 70% 的信心认为这是不可能的,但是有没有办法确保子类具有特定的构造函数或工厂方法?
在本例中,我尝试创建一个 StringSerialized
,它要求子类具有以下方法
toString
,将对象转换为String
。fromString
,从String
获取实例。
显然,在第一种情况下,我可以将 toString
抽象化。另一方面,拥有非静态 fromString
似乎是有问题的。但是,我无法创建抽象静态方法。我也不认为构造函数是完全合适的。
最佳答案
你是对的;在编译时强制它是不可能的。您可以在运行时执行各种技巧(例如在测试中使用反射),但仅此而已。
但是问问自己:为什么你想要这样做?您无法动态调用静态方法或构造函数(除非通过反射),那么如果您拥有这些所需的工厂,您将如何使用它们?
如果只是为了代码的一致性(这是一件好事!),那么您只需在开发代码库时确保一致性即可。基类中的注释在这里可以发挥很大作用,代码审查和其他“软”技术也可以。
如果您打算在反射中使用工厂,那么可以在测试中使用类似的反射,以确保每个子类都有它需要的位。
另一个选择是创建一个非静态工厂:
public interface FooMaker() {
Foo create(String arg);
}
...并使用它,而不是静态 fromString
方法。
您又遇到了同样的问题“如何确保每个子类都有 FooMaker
实现?”我再说一遍,你不应该担心这一点。如果您将 FooMaker 而不是子类作为代码的“起点”,那么子类在做什么并不重要;重要的是您的 FooMaker
为您提供了一种从字符串到 Foo
的方法,并且每个 Foo
都有一种返回的方法到一个字符串。
关于java - 强制子类具有特定的工厂方法或构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28422343/