【发布时间】:2015-12-22 10:23:02
【问题描述】:
伪代码
提供的 sn-ps 将被视为伪代码。如果有不同的解决方案是解决此问题的标准方法,我持开放态度。
这是关于预期用途的:
一些澄清:
- 每个应用程序将使用一个且仅一个配置。它不会在运行时更改。
-
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; }
}
UserDefinedConfiguration.java
public class UserDefinedConfiguration extends Configuration
{
@Override
public static int getFoo () { return 3; }
}
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());
}
}
现在回到主要问题,如何做到这一点?如果没有(或通过Configuration)getFoo() 应该返回1,如果通过UserDefinedConfiguration 然后3。
实现它的一种方法是存储Configuration 的实例。但是,当所有 getter 都是 static 时,它感觉是多余的。也不将它们设为static 也没有多大意义。
【问题讨论】:
-
It doesn't make much sense to not have them as static either.- 为什么不呢?您希望拥有不同的配置集,并且我假设您只创建每个配置集一次,因此非静态方法的“开销”(如果有的话)和配置的一个实例的创建应该无关紧要。你会自动获得@Override的干净解决方案。 -
因为拥有多个
Configurations 没有任何意义。这些方法直接属于Configuration。我并不真正担心“开销”。 -
配置值是否需要存在于代码中?另一种方法是创建属性文件或哈希映射的层次结构,其中稍后读取的值会覆盖以前的值。然后,您不需要将继承建模为类/接口。只是猜测,可能我完全误解了这个问题......
-
如果我理解正确的话,我想你已经明白了。
HashMap做存储部分的问题是它可以包含整数、字符串、双精度数等等。另外,我希望它对现有的东西更加坚定。我的想法是我提供Configuration,如果一两件事不符合用户的要求,那么他们可以只覆盖这些内容,同时保持其他所有内容不变。我还需要确保在运行时不能更改Configuration。虽然仍然可以访问。
标签: java