java - 强制子类具有特定的工厂方法或构造函数

标签 java oop inheritance constructor factory-method

我有 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/

相关文章:

java - 为什么 Hibernate 允许我在外键约束上插入空值?

java - 为什么我在 Windows 上尝试启动 Grails 3+ 时会收到 Forbidden <403> 错误?

java - 访问标识符的真实示例 [public, protected, private]

java - Java中的优化方法

swift - 为什么纯类协议(protocol)不满足协议(protocol)扩展 where 子句中的 AnyObject 约束?

python - Pycharm 警告 : must implement all abstract methods

java - Rad 上传 Java 小程序和 z-index

java - 在Java中是否必须使用抽象类作为根类?

c - 什么时候适合使用 C 作为面向对象语言?

匿名子类中的java通用对象构造