![](/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.