4

如果我有一堆类都包含一个 Enum 和 EnumMap 并且我想为这些类创建一个超类。

public interface ColorEnum {
}

class ColorMarbles extends Toy {
    enum MARBLE implements ColorEnum
        { BLUE, GREEN }
    EnumMap<MARBLE, String> names = new EnumMap<MARBLE, String>(MARBLE.class);
    //stuff
    // fields

    public void populate(ArrayList<String> designer) {
        int i = 0;
        for(MARBLE marble : MARBLE.values()) {
            marble.name = designer.get(i);
            i++;
        }
    }
}

class ColorBalloons extends Toy {
    enum BALLOON implements ColorEnum
        { YELLOW, RED }
    EnumMap<BALLOON, String> names = new EnumMap<BALLOON, String>(BALLOON.class);
    //stuff
    // fields

    public void populate(ArrayList<String> designer) {
        int i = 0;
        for(BALLOON balloon : BALLOON.values()) {
            balloon.name = designer.get(i);
            i++;
        }
    }
}

如何创建一个超类以拥有一个包含这样的 ColorEnum 类型的枚举的通用 EnumMap?

public abstract class Toy {
    EnumMap<ColorEnum, String> names;
}

eidt:我意识到我的例子太含糊了。狗可能是一个不好的例子。我把它改成希望更清楚的东西。

我拥有的是一堆类,它们具有填充 EnumMap 之类的方法。名称按预定义的顺序排列。我希望能够将它带到 Toy 超类中,而不是在每个类中定义填充,这样我就不必在每个新的类类型 Toy 中继续复制粘贴。

希望这将解释更多我在寻找什么。

4

2 回答 2

5

我感觉你的设计过于复杂了。

使用枚举

如果您不需要类继承,则可以像使用顶级类一样直接使用枚举。

public interface Animal {}

public enum Dog implements Animal {
    HUSKY("Husky"), LAB("Labrador");

    private final String name;

    Dog(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

枚举可以像任何其他 Java 类一样声明字段、方法和实现接口。它们唯一的限制是它们的直接超类始终是java.lang.Enum并且它们不能被扩展。

但是,每个枚举常量都可以将其自己的一组唯一数据传递给其构造函数。甚至有可能每个常量都可以通过其独特的实现覆盖该枚举的通用方法。

一个很好的教程,详细解释了枚举的全部功能:http: //javarevisited.blogspot.cz/2011/08/enum-in-java-example-tutorial.html


没有枚举

如果您需要一个实际的类继承来共享一些常用方法(例如来自Animal超类),我仍然会放弃 map 方法,而是尝试一些更面向 OOP 的方法:

public class Animal {
}

public abstract class Dog extends Animal {

    public abstract String getName();

    public static class Husky extends Dog {
        @Override
        public String getName() {
            return "husky";
        }
    }

    public static class Lab extends Dog {
        @Override
        public String getName() {
            return "labrador";
        }
    }

}
于 2013-02-20T16:21:04.327 回答
3

我用于此类事情的一种机制是扩展一个泛型基类,该基类具有一个泛型参数,允许您将Enum详细信息传递给它。

此示例Table为数据库表定义了一个基类:

public class Table<Column extends Enum<? extends Column>> {
  // Name of the table.
  protected final String tableName;
  // All of the columns in the table. This is actually an EnumSet so very efficient.
  protected final Set<Column> columns;

  /**
   * The base interface for all Column enums.
   */
  public interface Columns {
    // What type does it have in the database?
    public Type getType();
  }

  // Small list of database types.
  public enum Type {
    String, Number, Date;
  }

  public Table(String tableName,
               Set<Column> columns) {
    this.tableName = tableName;
    this.columns = columns;
  }

}

现在您可以将其子类化:

public class VersionTable extends Table<VersionTable.Column> {

  public enum Column implements Table.Columns {
    Version(Table.Type.String),
    ReleaseDate(Table.Type.Date);

    // Sadly all of this must be in ALL of your enums but most of the work can be pushed up to `Table`
    final Table.Type type;

    Column(Table.Type type) {
      this.type = type;
    }

    @Override
    public Type getType() {
      return type;
    }
  }

  public VersionTable() {
    super("Versions", EnumSet.allOf(Column.class));
  }
}

并利用处理您的枚举的父类中的功能。

注意这里我将一个传递EnumSetTable构造函数。EnumMap如果您认为 anEnumSet不够,我相信您可以更改它以适应您的要求。

于 2013-02-20T16:39:08.233 回答