![](/img/trans.png)
[英]Java bad practice: adding return statement to method solely for testing?
[英]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
。
我想到的方法如下:
string getName()
做類似item1.getName().equals("machine_gun")
的事情;EnumItem getEnum()
做item1.getEnum().equals(EnumItem.MACHINE_GUN)
;item1.equals(new Item("machine_gun"))
;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.