0

还有比这更好的“解决方法”吗?在访问 TableMap 上的方法时,我想避免使用 PREFIX(本地变量)。

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 {
    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();
    ...
4

2 回答 2

3

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

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

接近您想要的语法的一种方法是使用委托模式:

public enum Tables {
    ...
    public void method() {
        MAP.method();
    }
}
于 2013-10-03T09:39:53.390 回答
2

我认为您可能试图在enum.

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

本质上,创建enuma 子类并将其特征作为EnumSet. 这样,您仍然可以获得enums包括类型安全在内的所有好处。

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

}

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

于 2013-10-03T09:41:29.367 回答