gpt4 book ai didi

java - 将常量类作为参数传递并存储它

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:43 27 4
gpt4 key购买 nike

伪代码

所提供的片段将被视为伪代码。如果有不同的解决方案是解决此问题的标准方法,我持开放态度。

这是关于预期的用法:

一些说明:

  • 一个,每个应用程序将只使用一个配置。它不会在运行时更改。
  • Main.java 不允许@Override
  • Configuration.java 不能是 Interface,因为应为未覆盖的字段提供默认值。
  • Configuration.java 将从当前的两个字段中大幅增长。使构建器模式变得非常困惑。

配置.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; }
}

主.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 也没有多大意义。

注意:This is taken into account.

最佳答案

除非玩肮脏的反射,否则恐怕您将不得不使用实例而不是类。来自 @JonSkeet :

A singleton allows access to a single created instance - that instance (or rather, a reference to that instance) can be passed as a parameter to other methods, and treated as a normal object.

A static class allows only static methods.

这正是您想要做的:将配置作为参数传递。


我会创建一个定义默认值的抽象类:

public abstract class Configuration {
public int getFoo() { return 1; }
public int getBar() { return 2; }
}

然后,每个具体配置一个单例:

public final class DefaultConfiguration extends Configuration {
public static final Configuration INSTANCE = new DefaultConfiguration();
private DefaultConfiguration() {}
// nothing to override, use the default values
}

public final class UserDefinedConfiguration extends Configuration {
public static final Configuration INSTANCE = new UserDefinedConfiguration();
private UserDefinedConfiguration() {}
@Override public int getFoo() { return 3; } // specific `foo` value
}

最后,在您的 Main 中:

public class Main {
private final Configuration config;
public Main() { this(DefaultConfiguration.INSTANCE); }
public Main(Configuration config) { this.config = config; }
}

此外,请注意 Java 8 允许在接口(interface)内实现默认方法; Configuration 可以是一个接口(interface):

public interface Configuration {
default int getFoo() { return 1; }
default int getBar() { return 2; }
}

关于java - 将常量类作为参数传递并存储它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34413533/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com