Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java枚举扩展了解决方法_Java_Inheritance_Enums - Fatal编程技术网

Java枚举扩展了解决方法

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

还有比这更好的“解决办法”吗?我希望在访问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 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
实例。“我想你可能试图在枚举中加入太多的智能”-是的,我非常喜欢枚举的类型安全性,在这种情况下,我真的很喜欢枚举