簡體   English   中英

如何使包含枚舉列表的枚舉常量?

[英]How to make an enum constant containing a list of a enums?

最近我一直在嘗試做一個相對論的能量計算器。 我使用List<ComponentType>表示在ComponentType.ELECTRONComponentType.PROTONComponentType.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 ,否則任何非法粒子都不能構造,但是為此,您有文檔來確保他做正確的事。
  • 防御性復制的性能不是最好的,但是您絕對希望字符串不可變。 您可以考慮自己實現一個不可變的列表(不能更改列表中的元素),或者使用諸如guava之類的庫提供的(最好)。 我不會使用String數組,因為它們會給其他開發人員和您自己帶來很多負擔,我更喜歡對象。

我認為這沒有問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM