Java枚举扩展了变通方法

有没有比这更好的“解决方法”? 我想在访问TableMap上的方法时避免使用PREFIX(local var)。

public class TableMap extends TreeMap { public String field1, field2, field3; public TableMap(Tables table){} public void method(){} public void method2(){} public void method3(){} ... } 

解决方法!

 public enum Tables { table1, table2, table3; public final TableMap MAP=new TableMap(this); private Tables(){} } 

需要!

 public enum Tables extends TableMap { table1, table2, table3; public Tables(){ super(table); } } 

整个代码示例:

  // workaround! Tables.table1.MAP.method(); Tables.table2.MAP.method(); Tables.table3.MAP.method(); ... // needed! Tables.table1.method(); Tables.table2.method(); Tables.table3.method(); ... 

我想你可能会试图在enum加入过多的智能。

我发现这种方法非常有用。 它避免了由于你无法扩展enum而引起的许多问题(实际上你可以但不能以非常有用的方式)。

本质上,使enum成为一个子类,并将其特性作为EnumSet传递给您的超类。 这样你仍然可以获得enums所有好处,包括类型安全。

 public static class MappedEnum> extends TreeMap { public MappedEnum(EnumSet e) { // Whatever you like with the set. } public void method(E e) { } } public static class Foo extends MappedEnum { public enum Tables { table1, table2, table3; } public Foo() { super(EnumSet.allOf(Tables.class)); } @Override public void method(Foo.Tables e) { } } 

您甚至可以使用EnumMap而不是TreeMap来提高效率。

在Java中, enum类型必须扩展java.lang.Enum 。 由于Java类型只能扩展单个类型,您可能认为public class TableMap extends Enum可能有效,但不是,编译器不允许这样做。

在我自己的代码中,我经常使用enum作为键,因为它们是如此的敌对。 我让他们实现一个通用接口,然后使用工厂查找我可以使用的“worker”实例的特定实现。

更接近所需语法的一种方法是使用委托模式:

 public enum Tables { ... public void method() { MAP.method(); } }