代码之家  ›  专栏  ›  技术社区  ›  rhombidodecahedron

Java中的枚举继承?

  •  5
  • rhombidodecahedron  · 技术社区  · 15 年前

    我有几个星系的观测数据。对于其中的每一个,我都创建了一个StarDatabase类(一个Stars的HashMap)和一个Main类。

    我遇到的问题是BandName的枚举类型。到目前为止,我使用的所有数据都在I和V波段。现在我有J,H,K波段的数据。如果我简单地将J、H和K添加到BandName,那么迭代BandName中所有项并执行某些操作的所有循环现在都被破坏了。

    有什么想法吗?

    Edit:总结一下我的问题,我希望每个包都有自己的BandName枚举,它可以遍历。但这不起作用,因为Star包中的方法需要类型为的对象Star.BandName 我提供的是IndividualPackage.BandName.

    3 回复  |  直到 11 年前
        1
  •  20
  •   Péter Török    15 年前

    不能从另一个枚举继承枚举,尽管可以让枚举实现接口。所有枚举都隐式扩展的技术问题 java.lang.Enum

    在很大程度上,枚举的可扩展性 基类型,反之亦然。没有什么好方法可以列举所有的问题

    Effective Java 2nd Edition

    然而,我不完全理解你的问题:你没有用过吗 values() 用于遍历枚举?那么就不必担心用新值扩展枚举了。

    请更清楚地说明“破碎”是什么意思。

    更新:

    interface Band {
      String getName();
      void doStuff();
      ...
    }
    
    enum BandsVI implements Band {
      V, I;
      public String getName() { return toString(); }
      public void doStuff() { /* do stuff as appropriate for these bands */ }
      ...
    }
    
    enum BandsJHK implements Band {
      J, H, K;
      public String getName() { return toString(); }
      public void doStuff() { /* do stuff as appropriate for these bands */ }
      ...
    }
    

    class Star<T extends Enum<T> & Band> {
      private Class<T> bandType;
      public Star(Class<T> bandType) { this.bandType = bandType; }
      public void printBandNames() {
        for (Band b : bandType.getEnumConstants())
          System.out.println(b.getName());
      }
      public void doStuffOnAllBands() {
        for (Band b : bandType.getEnumConstants())
          b.doStuff();
      }
    }
    ...
    Star<BandsVI> star1 = new Star<BandsVI>(BandsVI.class);
    Star<BandsJHK> star2 = new Star<BandsJHK>(BandsJHK.class);
    star1.printBandNames(); // prints V I
    star2.printBandNames(); // prints J H K
    

    如果乐队被组织成不同的组,这会很好地工作。但是,如果有混合波段组的恒星,您可能更喜欢另一种方法:

    class Star {
      private List<? extends Band> bandTypes;
      public Star(List<? extends Band> bandTypes) { this.bandTypes = bandTypes; }
      public void printBandNames() {
        for (Band b : bandTypes)
          System.out.println(b.getName());
      }
      ...
    }
    
    ...
    Star star1 = new Star(Arrays.asList(BandsVI.values()));
    Star star3 = new Star(Arrays.asList(new Band[]{BandsVI.V, BandsVI.I, BandsJHK.K}));
    ...
    

    这允许你用任意的波段组合来建立恒星。然而,这种方式你不能使用 EnumSet EnumMap 在乐队里。

        2
  •  1
  •   Jordan Allan    15 年前

    所有枚举都隐式扩展java.lang.Enum. 由于Java不支持多重继承,枚举不能扩展任何其他内容- http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

        3
  •  1
  •   Winston Ewert    15 年前

    这就是我要做的(伪代码):

    class Band
    {
         String name;
    };
    static Band J("J");
    static Band K("K");
    
    static ArrayList<Band> JK;
    static ArrayList<Band> IHL;
    
    class Star
    {
        Star(ArrayList<Band> bands)
    }