Java 强制子类具有特定的工厂方法或构造函数
我有70%的信心这是不可能的,但有没有办法确保子类具有特定的构造函数或工厂方法 在本例中,我试图创建一个Java 强制子类具有特定的工厂方法或构造函数,java,oop,inheritance,constructor,factory-method,Java,Oop,Inheritance,Constructor,Factory Method,我有70%的信心这是不可能的,但有没有办法确保子类具有特定的构造函数或工厂方法 在本例中,我试图创建一个StringSerializable,它要求子类具有以下方法 toString,它将对象转换为字符串 fromString,它从字符串获取实例 显然,在第一种情况下,我可以将toString抽象化。另一方面,使用非静态fromString似乎有问题。但是,我不能创建抽象的静态方法。我也不认为构造函数是完全合适的;在编译时强制它是不可能的。您可以在运行时使用各种技巧(例如在测试中使用反射),
StringSerializable
,它要求子类具有以下方法
,它将对象转换为toString
字符串
,它从fromString
获取实例字符串
显然,在第一种情况下,我可以将
toString
抽象化。另一方面,使用非静态fromString
似乎有问题。但是,我不能创建抽象的静态方法。我也不认为构造函数是完全合适的;在编译时强制它是不可能的。您可以在运行时使用各种技巧(例如在测试中使用反射),但仅此而已
但是问问你自己:你为什么要这样做?您不能动态调用静态方法或构造函数(通过反射除外),因此,如果您拥有这些必需的工厂,您将如何准确地使用它们呢
如果只是为了代码的一致性(这是一件好事!),那么在开发代码库时,您只需要确保一致性。基类中的注释在这里可以起到很大的作用,代码评审和其他“软”技术也是如此
如果您计划在反射中使用工厂,那么可以在测试中使用类似的反射,以确保每个子类都有它需要的位
另一个选项是创建非静态工厂:
public interface FooMaker() {
Foo create(String arg);
}
。。。并使用该方法,而不是静态的fromString
方法
这里再次出现了同样的问题“如何确保每个子类都有一个
FooMaker
实现?”我要再次指出,您不必担心这一点。如果您将FooMaker
作为代码的“起点”,而不是子类,那么子类在做什么并不重要;重要的是你的FooMaker
s给了你一种从字符串到Foo
s的方法,而每个Foo
都有一种回到字符串的方法。你是对的;在编译时强制它是不可能的。您可以在运行时使用各种技巧(例如在测试中使用反射),但仅此而已
但是问问你自己:你为什么要这样做?您不能动态调用静态方法或构造函数(通过反射除外),因此,如果您拥有这些必需的工厂,您将如何准确地使用它们呢
如果只是为了代码的一致性(这是一件好事!),那么在开发代码库时,您只需要确保一致性。基类中的注释在这里可以起到很大的作用,代码评审和其他“软”技术也是如此
如果您计划在反射中使用工厂,那么可以在测试中使用类似的反射,以确保每个子类都有它需要的位
另一个选项是创建非静态工厂:
public interface FooMaker() {
Foo create(String arg);
}
。。。并使用该方法,而不是静态的fromString
方法
这里再次出现了同样的问题“如何确保每个子类都有一个
FooMaker
实现?”我要再次指出,您不必担心这一点。如果您将FooMaker
作为代码的“起点”,而不是子类,那么子类在做什么并不重要;重要的是你的FooMaker
s给了你一种从字符串到Foo
s的方法,而每个Foo
都有一种回到字符串的方法。你是对的;在编译时强制它是不可能的。您可以在运行时使用各种技巧(例如在测试中使用反射),但仅此而已
但是问问你自己:你为什么要这样做?您不能动态调用静态方法或构造函数(通过反射除外),因此,如果您拥有这些必需的工厂,您将如何准确地使用它们呢
如果只是为了代码的一致性(这是一件好事!),那么在开发代码库时,您只需要确保一致性。基类中的注释在这里可以起到很大的作用,代码评审和其他“软”技术也是如此
如果您计划在反射中使用工厂,那么可以在测试中使用类似的反射,以确保每个子类都有它需要的位
另一个选项是创建非静态工厂:
public interface FooMaker() {
Foo create(String arg);
}
。。。并使用该方法,而不是静态的fromString
方法
这里再次出现了同样的问题“如何确保每个子类都有一个
FooMaker
实现?”我要再次指出,您不必担心这一点。如果您将FooMaker
作为代码的“起点”,而不是子类,那么子类在做什么并不重要;重要的是你的FooMaker
s给了你一种从字符串到Foo
s的方法,而每个Foo
都有一种回到字符串的方法。你是对的;在编译时强制它是不可能的。您可以在运行时使用各种技巧(例如在测试中使用反射),但仅此而已
但是问问你自己:你为什么要这样做?您不能动态调用静态方法或构造函数(通过反射除外),因此,如果您拥有这些必需的工厂,您将如何准确地使用它们呢
如果只是为了代码的一致性(这是一件好事!),那么在开发代码库时,您只需要确保一致性。基类中的注释在这里可以起到很大的作用,代码评审和其他“软”技术也是如此
如果您计划在反射中使用工厂,那么可以在测试中使用类似的反射,以确保每个子类都有它需要的位
另一个