伪代码
提供的片段将被视为伪代码.如果有一个不同的解决方案是解决这个问题的标准方法,我愿意接受.
这与预期用量有关:
一些澄清:
Main.java不能允许@Override.Configuration.java不能是一个Interface默认值应该给不被覆盖的字段.Configuration.java将从其目前的两个领域大幅增长.渲染构建器模式非常混乱.Configuration.java
public class Configuration
{
public static int getFoo () { return 1; }
public static int getBar () { return 2; }
}
Run Code Online (Sandbox Code Playgroud)
UserDefinedConfiguration.java
public class UserDefinedConfiguration extends Configuration
{
@Override
public static int getFoo () { return 3; }
}
Run Code Online (Sandbox Code Playgroud)
Main.java
public final class Main {
private final Configuration config;
// default configuration
public Main () {
this (Configuration.class);
}
// user-defined configuration
public Main (Class<? extends Configuration> config) {
this.config = config;
}
// dummy-test
public void printFoo () {
System.out.println(config.getFoo());
}
}
Run Code Online (Sandbox Code Playgroud)
现在回答主要问题,如何实现这一目标?如果没有(或被Configuration传递)getFoo()应该返回1,如果UserDefinedConfiguration传递那么3.
实现它的一种方法是存储一个实例Configuration.然而,当所有吸气剂都是时,感觉多余static.没有它们也没有多大意义static.
注意:这被考虑在内.
因此本质上,您需要类型而不是实例的多态性。在 Java 中,这通常是通过泛型类型完成的:
class GenericMain<T extends Configuration>
{
private final T config;
}
Run Code Online (Sandbox Code Playgroud)
并且因为 Java 不允许默认泛型参数,所以您必须定义另一个类来指定默认值:
class DefaultMain extends GenericMain<Configuration>
{
}
Run Code Online (Sandbox Code Playgroud)
Main ()这些与您和构造函数一对一匹配Main (Class<? extends Configuration> config)。
或者,您可以存储一个实例Configuration并执行如下操作:
public class Configuration
{
private final int foo = 1;
private final int bar = 2;
public final int getFoo () { return foo; }
public final int getBar () { return bar; }
public Configuration () {}
protected Configuration (int foo) {
this.foo = foo;
}
}
public class UserDefinedConfiguration extends Configuration
{
public UserDefinedConfiguration() {
super(3);
}
}
Run Code Online (Sandbox Code Playgroud)