gpt4 book ai didi

java - 在 Java 中更改接口(interface)常量的实用替代方案

转载 作者:行者123 更新时间:2023-12-02 04:48:26 24 4
gpt4 key购买 nike

假设您有一个包含多个类的 Java 项目,其中大多数处理一些常量(数据集的属性,应该在实验开始时加载(基于您的数据集))。

为了能够访问整个类中的这些常量,一个非常合理的选择是将常量作为容器(对象/类/接口(interface))的字段。然后,为了让其他类利用容器字段,您有 5 种方法

仅当字段是动态的时:

  • 将容器传递给处理方法(处理所需常量的方法)
  • 将容器放入方法类(您的方法所在的类)的字段中。

无论该字段是动态的还是静态的(当容器是一个类时)

  • 通过方法类扩展该字段的容器。

仅当字段是静态的

  • 通过方法类实现该字段的容器。
  • 调用静态字段(Container.field)

前两个选项和最后一个选项迫使您在代码中写入数十或数百次容器名称 + '.' (例如container.trainingListSize,container.numberOfUsers,Container.trainingListSize,Container.numberOfUsers,...)我试图摆脱它;第三种选择迫使你成为特殊阶层的儿子,这有时与你的计划结构相矛盾。它仍然只是最后一个选择;但不幸的是,在 Java 接口(interface)中,接口(interface)的常量值是最终的,无法在程序开始时加载属性文件时设置。

看问题( Variables in Interface ),看来提问者的情况和我一样;但我还没有找到解决方案。

最佳答案

我认为您的软件架构需要有明确的意图和关注点分离。您谈论“常量”,但随后提到从文件加载它们,因此这些毕竟不是真正的常量。这些更像是配置参数。如果这是正确的,您有多种选择。

您可以将您的配置视为全局变量:在这种情况下,我建议创建一个单例类,从文件加载变量并提供实用方法来访问它们,例如,MyConfig.someParameter()。请注意,您可以静态导入 MyConfig.*,从而只需使用 someParameter() 即可访问变量。

您可以将您的配置视为其他容器或上下文的一部分,在这种情况下,要拥有您想要的精简语法要困难得多,但您必须注入(inject)上下文然后从代码中调用 context.someParameter() 。我不建议将此上下文类作为其他对象的基类,因为它绝对违反了关注点分离和 OOP 规则,即如果 Foo 不是 Context 它应该' t 从它延伸。请注意,这基本上是您描述的第一个选项。

我应该补充一点,只有当成员是静态且最终的时,才可以在接口(interface)中定义成员。这并不奇怪,因为 java 不支持多重继承或“mixins”。这是 Java 语言规范团队经过深思熟虑的选择,我相信这是一个很好的选择。您想要做的事情并不真正符合您可以神奇地扩展并从中获取所有成员的接口(interface)的概念,除非您使用 java 8 并定义了依赖于从文件或其他内容读取的某些映射的默认方法,例如,

interface Config {
Map<String, String> getProperties();
default String someProperty() {
return getProperties().get("some-prop");
}
// ... more utility methods follow
}

上面的接口(interface)定义了一堆(仅显示一个)实用方法,返回由字符串作为键的字符串属性(实际上可以是任何值)。在启动时,您可以将映射(例如通过文件读取)注入(inject)到您的类中,并为您神奇地定义所有这些实用方法。

使用这种方法的类的代码如下所示:

class MyExperiment implements Config {
private final Map<String, String> props;
MyExperiment(Map<String, String> props) { this.props = props; }

void someMethod() {
// read property from injected configuration
String someProp = someProperty();
}
}

这可能会节省您一些输入,但仍然需要您的类实现 Config 并定义 getProperties() 方法,在我看来,这违反了关注点分离和应该避免。

关于java - 在 Java 中更改接口(interface)常量的实用替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29474203/

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