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(); } }