[英]How to make an enum constant containing a list of a enums?
最近我一直在嘗試做一個相對論的能量計算器。 我使用List<ComponentType>
表示在ComponentType.ELECTRON
, ComponentType.PROTON
和ComponentType.NEUTRON
上構建的任何粒子,其中ComponentType
是包含質量的enum
。
后來我想制作一個ParticleFactory
類,該類與GUI下拉列表中的基本粒子列表相對應。 像: ParticleFactory(Hydrogen)
將給我一個包含{ComponentType.ELECTRON, ComponentType.PROTON}
列表的粒子對象。 這將使修改變得容易,因為ParticleFactory
和GUI會對ParticleFactory
使用相同的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
的接口。 您可以使用以下代碼實現此目的:
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
,否則任何非法粒子都不能構造,但是為此,您有文檔來確保他做正確的事。 我認為這沒有問題:
public enum GenericParticleType {
ELECTRON(new String[] { "electron", "e" },
new ArrayList<GenericParticleType>()),
MULTI_ELECTRON(new String[] { "me" }, Arrays.asList(ELECTRON, ELECTRON)),
COMPOSITION(new String[] { "c" }, Arrays.asList(MULTI_ELECTRON, ELECTRON,
ELECTRON));
private final String[] names;
private final List<GenericParticleType> components;
GenericParticleType(String[] names, List<GenericParticleType> components) {
this.names = names;
this.components = components;
}
public String[] getNames() {
return names;
}
public List<GenericParticleType> getComponents() {
return components;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.