Java中的枚举继承?

Java中的枚举继承?,java,enums,Java,Enums,我在做天体物理学研究。我编写了一个包含Star、Band和Datfile类的包。我还有枚举类型的BandName。每个星包含几个波段,每个波段包含几个DAT文件 我有几个星系的观测数据。对于其中的每一个,我都创建了一个StarDatabase类(Stars的HashMap)和一个Main类 我遇到的问题是带名称的枚举类型。到目前为止,我使用的所有数据都在I和V波段。现在我有J,H,K波段的数据。如果我只是简单地将J、H和K添加到BandName,那么迭代BandName中所有项并执行某些操作的所

我在做天体物理学研究。我编写了一个包含Star、Band和Datfile类的包。我还有枚举类型的BandName。每个星包含几个波段,每个波段包含几个DAT文件

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

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

有什么想法吗


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

您不能从另一个枚举继承枚举,尽管您可以让您的枚举实现一个接口。技术问题(所有枚举隐式扩展
java.lang.Enum
,因此它们不能扩展另一个类,只能实现附加接口)并非偶然:

在大多数情况下,枚举的可扩展性被证明是 这是个坏主意。扩展类型的元素是 基本类型,反之亦然。没有什么好方法可以列举所有的问题 基类型及其扩展的元素。最后,可扩展性会使问题复杂化 设计和实现的许多方面

从,项目34

然而,我并不完全理解您的问题:您是否使用了
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 */ }
  ...
}
您可以通过使Star类成为通用类来使用这些:

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
星级酒店{
私有类波段类型;
公共星(类bandType){this.bandType=bandType;}
public void printBandNames(){
对于(频带b:bandType.getEnumConstants())
System.out.println(b.getName());
}
公共无效文件{
对于(频带b:bandType.getEnumConstants())
b、 doStuff();
}
}
...
Star star1=新星(BandsVI.class);
Star star2=新星(BandsJHK.class);
star1.printBandNames();//打印V I
star2.printBandNames();//打印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}));
...
星级酒店{

私有列表所有枚举都隐式扩展java.lang.Enum。由于java不支持多重继承,因此枚举不能扩展任何其他内容。-

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

类带
{
字符串名;
};
静态频带J(“J”);
静态频带K(“K”);
静态数组列表JK;
静态阵列列表IHL;
班级明星
{
星(ArrayList乐队)
}

通过这种方式,您可以通过创建更多的波段对象来添加波段。每个起始点都有它所使用的波段列表,因此可以对所有波段进行迭代。

为什么要对波段名称进行迭代?如果确实需要添加新波段,则我使用波段名称的所有地方都不需要更新。软件包对应于什么?也就是说,为什么需要更新你首先要对这些类进行子类划分吗?我有几个包,每个星系一个,它们都需要使用Star、Band和Datfile。它们都有一个不同的StarDatabase(因为它们的数据由其他人以不同的方式组织)和Main类,其中两个具有GUI。可能的重复例如,每个星形对象都会迭代BandName.values(),并使用命名值添加一个新的Band。然后该Band在目录/值中查找以获取DAT文件。然后GUI会在BandName.values()中的每个Band中创建一个新的BandRadioButton…等等。@Earl,我还是不明白问题出在哪里:是新波段的DAT文件丢失了,还是GUI搞乱了,还是…?GUI确实搞乱了。与V和I波段有关的星星根本不应该与J、H或K交互。我希望它迭代这些值(而不是明确地命名它们)如果真的需要增加一个新乐队的话。@Earl,我明白了。那么你的明星只有V和I乐队。其他的呢?他们是只关心J、H和K乐队,还是所有乐队?我知道。所以问题就来了。@Earl,他没法知道你知道这一点。如果你不给出答案,我们很难给你好的答案关于这个问题,我向你提供了足够的信息。我向你道歉。这并不是说你粗鲁无礼。
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)
}