簡體   English   中英

在 Java 中返回枚舉是不好的做法嗎?

[英]Is it bad practice to return Enums in Java?

假設我在游戲中有一個 class 到 model 一個項目,如下所示:

public class Item {
    private final EnumItem type;
    
    public Item(EnumItem type) {
        this.type = type;
    }
        
    public Item(String name) {
        this.type = EnumItem.fromName(name);
    }
}

public enum EnumItem {
    MACHINE_GUN("machine_gun"),
    SWORD("sword"),
    BAT("bat"),
    DEFAULT("default");
    
    private final String name;
    
    public EnumItem(name) {
        this.name = name;
    }

    public String getName() { return name; }

    public static EnumItem fromName(String name) {
        for(EnumItem i: EnumItem.values()) {
            if(i.name.equals(name)) {
                return i;
            } else {
                return EnumItem.DEFAULT;
            }
        }
    }
}

假設Item.equals().hashCode()被正確覆蓋以比較內部 Enum。

現在我想要一種方法用 Item 中的 getter 來區分這些Item :我應該返回Enum還是String名稱? 一般來說,返回Enum是一種好習慣嗎? 還是有更好的方法來區分這些Item 因為返回 enum 看起來像是將代表暴露給我,我不希望我的同事直接使用EnumItem來比較Item

我想到的方法如下:

  1. string getName()做類似item1.getName().equals("machine_gun")的事情;
  2. EnumItem getEnum()item1.getEnum().equals(EnumItem.MACHINE_GUN) ;
  3. item1.equals(new Item("machine_gun")) ;
  4. static name(String name) { new Item(name) } to do item1.equals(Item.name("machine_gun")) ;

我不知道我該怎么做,我會感謝有經驗的程序員的一些見解。

我知道它們看起來像從上下文來看,但在我的用例中,這些項目沒有特殊功能可以證明從基本項目 class 擴展是合理的。

這是好習慣嗎? 當然,您正在使用聚合,因為 Item 不依賴於 EnumItem,這很好。 話雖這么說,能不能做得更好? 當然。 我提供的替代方案是唯一的解決方案嗎? 不。

選擇

如果您希望它是可擴展的,請考慮使用接口來表示一個項目。 然后允許接口擴展這個接口以提供一些標准類型。 或者,您可以使用組合或聚合在 EnumItem 內定義實現 Item 接口的類型,以確保 Item 的 equals/hashcode 始終被覆蓋並遵守某些約定。

interface Item {

    String key();

}

enum EnumItem implement Item {

    private final String key;

    EnumItem(String key) {
        this.key = key;
    }

    @Override
    public String key() {
        return key;
    }

}

class AbstractItem implements Item {
    
    // constructor, override name()
    
}
Item item = EnumItem.FOO_BAR;

Item item2 = new AbstractItem("FooBar");

Item item3 = () -> "FooBar";

暫無
暫無

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

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