簡體   English   中英

Java枚舉擴展了解決方法

[英]Java enum extends workaround

是否有比這更好的“解決方法”? 訪問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();
    ...

在Java中, enum類型必須擴展java.lang.Enum 由於Java類型只能擴展一個類型,因此您可能認為public class TableMap extends Enum可能有效,但不可以,編譯器不允許這樣做。

在我自己的代碼中,我經常將enum用作鍵,因為它們是如此敵對。 我讓他們實現了一個通用接口,然后使用工廠來查找我可以使用的“工人”實例的特定實現。

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

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

我認為您可能正在嘗試將過多的情報放入enum

我發現這種方法非常有用。 它避免了由於不能擴展enum而引起的許多問題(實際上,您可以但不能以非常有用的方式)。

本質上,使enum成為子類,並將其特征作為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) {
  }

}

您甚至可以使用EnumMap代替TreeMap來提高效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM