Java枚举扩展了解决方法
还有比这更好的“解决办法”吗?我希望在访问TableMap上的方法时避免使用前缀(localvar)Java枚举扩展了解决方法,java,inheritance,enums,Java,Inheritance,Enums,还有比这更好的“解决办法”吗?我希望在访问TableMap上的方法时避免使用前缀(localvar) public class TableMap extends TreeMap<String, String> { public String field1, field2, field3; public TableMap(Tables table){} public void method(){} public void method2(){}
public class TableMap extends TreeMap<String, String> {
public String field1, field2, field3;
public TableMap(Tables table){}
public void method(){}
public void method2(){}
public void method3(){}
...
}
需要
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();
...
在Java中,
enum
类型必须扩展Java.lang.enum
。由于Java类型只能扩展单个类型,您可能会认为公共类TableMap extensed Enum
可能会起作用,但是编译器不允许这样做
在我自己的代码中,我经常将enum
s仅仅用作键,因为它们非常敌对。我让他们实现一个公共接口,然后使用工厂查找我可以使用的“worker”实例的特定实现
接近所需语法的一种方法是使用委托模式:
public enum Tables {
...
public void method() {
MAP.method();
}
}
在Java中,
enum
类型必须扩展Java.lang.enum
。由于Java类型只能扩展单个类型,您可能会认为公共类TableMap extensed Enum
可能会起作用,但是编译器不允许这样做
在我自己的代码中,我经常将enum
s仅仅用作键,因为它们非常敌对。我让他们实现一个公共接口,然后使用工厂查找我可以使用的“worker”实例的特定实现
接近所需语法的一种方法是使用委托模式:
public enum Tables {
...
public void method() {
MAP.method();
}
}
我认为您可能试图在
enum
中添加太多的智能
我发现这种方法非常有用。它避免了由于无法扩展enum
s(实际上可以,但不是以非常有用的方式)而引起的许多问题
本质上,将enum
作为一个子类,并将其特征作为EnumSet
传递给您的超类。这样,您仍然可以获得enum
的所有好处,包括类型安全性
public static class MappedEnum<E extends Enum<E>> extends TreeMap<String, String> {
public MappedEnum(EnumSet<E> e) {
// Whatever you like with the set.
}
public void method(E e) {
}
}
public static class Foo extends MappedEnum<Foo.Tables> {
public enum Tables {
table1, table2, table3;
}
public Foo() {
super(EnumSet.allOf(Tables.class));
}
@Override
public void method(Foo.Tables e) {
}
}
公共静态类mappednum扩展了TreeMap{
公共MappedEnum(枚举集e){
//不管你喜欢这台电视机。
}
公开作废法(E){
}
}
公共静态类Foo扩展了mappednum{
公共枚举表{
表1、表2、表3;
}
公共食物({
super(EnumSet.allOf(Tables.class));
}
@凌驾
公共作废法(Foo.e表){
}
}
您甚至可以使用
EnumMap
而不是TreeMap
来提高效率。我认为您可能试图在enum
中投入过多的智能
我发现这种方法非常有用。它避免了由于无法扩展enum
s(实际上可以,但不是以非常有用的方式)而引起的许多问题
本质上,将enum
作为一个子类,并将其特征作为EnumSet
传递给您的超类。这样,您仍然可以获得enum
的所有好处,包括类型安全性
public static class MappedEnum<E extends Enum<E>> extends TreeMap<String, String> {
public MappedEnum(EnumSet<E> e) {
// Whatever you like with the set.
}
public void method(E e) {
}
}
public static class Foo extends MappedEnum<Foo.Tables> {
public enum Tables {
table1, table2, table3;
}
public Foo() {
super(EnumSet.allOf(Tables.class));
}
@Override
public void method(Foo.Tables e) {
}
}
公共静态类mappednum扩展了TreeMap{
公共MappedEnum(枚举集e){
//不管你喜欢这台电视机。
}
公开作废法(E){
}
}
公共静态类Foo扩展了mappednum{
公共枚举表{
表1、表2、表3;
}
公共食物({
super(EnumSet.allOf(Tables.class));
}
@凌驾
公共作废法(Foo.e表){
}
}
您甚至可以使用
EnumMap
而不是TreeMap
来提高效率。问题(虽然似乎是一个有价值的好问题)有点不清楚,请添加更多上下文。问题(虽然似乎是一个有价值的好问题)有点不清楚,请添加更多上下文。我理解,但不是最好的方法,方法太多了!使用IDE生成方法。除此之外,Map
接口还有一个values()
方法,该方法的签名与枚举不同,因此您无法实现枚举Map@BlankChisui:接得好。我的方法允许重命名该方法,以便您可以访问它。但在这种情况下,即使我们可以通过某种方式实现继承,它也排除了继承的可能性。我理解,但不是最好的方法,方法太多了!使用IDE生成方法。除此之外,Map
接口还有一个values()
方法,该方法的签名与枚举不同,因此您无法实现枚举Map@BlankChisui:接得好。我的方法允许重命名该方法,以便您可以访问它。但在这种情况下,即使我们可以通过某种方式实现继承,它也排除了继承的可能性。看起来很有趣,但似乎不适合这个问题:OP希望每个枚举条目都有一个Foo
。“我想你可能试图在枚举中加入太多的智能”-是的,出于类型安全考虑,我非常喜欢枚举,在这种情况下,我真的看不到枚举不能扩展的有效原因…@AaronDigulla-此重构的结果意味着您可以使用MappedEnum tables=…
,然后使用tables.method(Foo.table1)
。它将调用机制从内到外转换,但现在您有了更清晰的结构。PS-在方法中添加了E
参数
@OldCurmudgeon:好的,它开始有意义了。我现在的主要批评是,这意味着您需要在method()
中进行切换,而不是依赖继承。或者您使用EnumMap
为每个枚举值存储一个处理程序。@AaronDigulla-根据我的经验,您很少需要特定于枚举的方法,只需要以某种方式对每个枚举进行分类。在这里,您可以通过使枚举实现一个公开其分类的接口来实现这一点MappedEnum
然后使用您描述的Map
,但仅用于映射分类。在我看来,将案例
与枚举
一起使用是一种代码味道。看起来很有趣,但似乎不适合这个问题:OP希望每个枚举条目都有一个Foo
实例。“我想你可能试图在枚举中加入太多的智能”-是的,我非常喜欢枚举的类型安全性,在这种情况下,我真的很喜欢枚举