Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制子类具有特定的工厂方法或构造函数_Java_Oop_Inheritance_Constructor_Factory Method - Fatal编程技术网

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

Java 强制子类具有特定的工厂方法或构造函数,java,oop,inheritance,constructor,factory-method,Java,Oop,Inheritance,Constructor,Factory Method,我有70%的信心这是不可能的,但有没有办法确保子类具有特定的构造函数或工厂方法 在本例中,我试图创建一个StringSerializable,它要求子类具有以下方法 toString,它将对象转换为字符串 fromString,它从字符串获取实例 显然,在第一种情况下,我可以将toString抽象化。另一方面,使用非静态fromString似乎有问题。但是,我不能创建抽象的静态方法。我也不认为构造函数是完全合适的;在编译时强制它是不可能的。您可以在运行时使用各种技巧(例如在测试中使用反射),

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

在本例中,我试图创建一个
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
都有一种回到字符串的方法。

你是对的;在编译时强制它是不可能的。您可以在运行时使用各种技巧(例如在测试中使用反射),但仅此而已

但是问问你自己:你为什么要这样做?您不能动态调用静态方法或构造函数(通过反射除外),因此,如果您拥有这些必需的工厂,您将如何准确地使用它们呢

如果只是为了代码的一致性(这是一件好事!),那么在开发代码库时,您只需要确保一致性。基类中的注释在这里可以起到很大的作用,代码评审和其他“软”技术也是如此

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

另一个