gpt4 book ai didi

java - 如何创建包含枚举列表的枚举常量?

转载 作者:行者123 更新时间:2023-11-30 11:18:48 30 4
gpt4 key购买 nike

最近我一直在尝试制作一个相对论能量计算器。我用了List<ComponentType>表示构建在 ComponentType.ELECTRON 上的任何粒子, ComponentType.PROTONComponentType.NEUTRON , 其中ComponentTypeenum含质量。

后来我想做一个ParticleFactory对应于 GUI 下拉列表中的基本粒子列表的类。喜欢:ParticleFactory(Hydrogen)会给我一个包含 {ComponentType.ELECTRON, ComponentType.PROTON} 的粒子对象列表。这将使修改变得容易,因为 ParticleFactory和 GUI 将使用相同的 enum带基本粒子。

当我尝试实现它时出现了问题。我知道它不可能使用不正确的语法,但无论我做什么,我总是会出错。

public enum GenericParticleType {

ELECTRON({"electron","e"}, new ArrayList<ComponentType>());

private final String[] names;
private final List<ComponentType> components;

GenericParticleType(String[] names, List<ComponentType> components) {
this.names = names;
this.components = components;
}
}

目标是使enum包含其他列表 enums . :D 有什么正确的方法可以做到这一点吗?

是否有更好的方法来做到这一点?常数 HashMap

最佳答案

我认为您想要以下设计:

  • 一个名为 GenericParticle 的接口(interface)。
  • 提供最基本实现的枚举。
  • 工厂/建筑商,您可以在这里制造任何您想要的东西。

您可以使用以下代码实现此目的:

enum Component {
ELECTRON, PROTON, NEUTRON;
}

interface GenericParticle {
List<String> getNames();

List<Component> getComponents();
}

enum BasicGenericParticle implements GenericParticle {
ELECTRON(
Arrays.asList("electron", "e"),
Arrays.asList(Component.ELECTRON)
),
HYDROGEN(
Arrays.asList("hydrogen", "h"),
Arrays.asList(Component.ELECTRON, Component.PROTON)
)
;

private final List<String> names;
private final List<Component> components;

private BasicGenericParticle(final List<String> names, final List<Component> components) {
this.names = names;
this.components = components;
}

@Override
public List<String> getNames() {
return new ArrayList<>(names);
}

@Override
public List<Component> getComponents() {
return new ArrayList<>(components);
}
}

class GenericParticleBuilder {
private List<String> names = new ArrayList<>();
private List<Component> components = new ArrayList<>();

public GenericParticleBuilder name(final String name) {
names.add(name);
return this;
}

public GenericParticleBuilder component(final Component component) {
components.add(component);
return this;
}

public GenericParticle build() {
return new GenericParticleImpl(names, components);
}

private static class GenericParticleImpl implements GenericParticle {
private List<String> names = new ArrayList<>();
private List<Component> components = new ArrayList<>();

public GenericParticleImpl(final List<String> names, final List<Component> components) {
this.names = names;
this.components = components;
}

@Override
public List<String> getNames() {
return new ArrayList<>(names);
}

@Override
public List<Component> getComponents() {
return new ArrayList<>(components);
}
}
}

用作:

    GenericParticle electron = BasicGenericParticle.ELECTRON;
GenericParticle hydrogen = BasicGenericParticle.HYDROGEN;
GenericParticle water = new GenericParticleBuilder()
.name("water").name("h2o2")
.component(/*components*/)
.build();

您确实需要针对以下事实对您的设备采取预防措施:

  • 不应该构造任何非法粒子,当然除非客户自己实现 GenericParticle,但为此你有文档来确保他做正确的事情。
  • 防御性复制的性能不是最好的,但您绝对希望字符串是不可变的。您可以考虑自己实现一个不可变列表(应该不可能更改列表中的元素),或者使用库提供的列表,例如 Guava (最好)。我不会使用字符串数组,因为它们会给其他开发人员和您自己带来很多负担,我更喜欢对象。

关于java - 如何创建包含枚举列表的枚举常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23614212/

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