假设我有一个类来为游戏中的一个项目建模,如下所示:
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()
以比较内部枚举)
现在我想要一种方法来用item
中的getter来区分这些项:我应该返回enum
还是string
名称?一般情况下返回枚举
是好的做法吗?或者是否有更好的方法来区分这些item
s?因为返回枚举类似于向我公开rep,而且我不希望我的同事直接使用EnumItem
来比较Item
的
我想到的办法如下:
字符串getName()
执行类似item1.getName().equals(“machine_gun”)
;EnumItem getEnum()
要执行item1.getEnum().equals(enumitem.machine_gun)
;item1.equals(新项目(“machine_gun”))
;静态名称(字符串名称){new Item(name)}
要执行item1.equals(Item.name(“machine_gun”))
;我不知道该怎么做,我希望有经验的程序员能给我一些启示。
编辑:我知道它们看起来像是从上下文中得到的,但是在我的用例中,这些项没有特殊的功能来证明从基项类扩展是合理的
这种做法好吗?当然,您使用的是聚合,因为Item不依赖于EnumItem,这很好。话虽如此,还能做得更好吗?当然可以。我提供的替代方案是唯一的解决方案吗?没有。
备选方案
如果希望它是可扩展的,请考虑使用接口来表示项。然后允许接口扩展此接口以提供一些标准类型。
interface Item {
String name();
}
enum EnumItem implement Item {
private final String name;
EnumItem(String name) {
this.name = name;
}
@Override
public String name() {
return name;
}
}
class AbstractItem implements Item {
// constructor, override name()
}
Item item = EnumItem.FOO_BAR;
Item item2 = new AbstractItem("FooBar");
Item item3 = () -> "FooBar";
问题内容: 我想声明一个枚举Direction,它具有一个返回相反方向的方法(以下语法不正确,即,不能实例化枚举,但它说明了我的观点)。这在Java中可行吗? 这是代码: 问题答案: 对于那些按标题吸引的人:是的,您可以在枚举中定义自己的方法。如果您想知道如何调用这种非静态方法,则可以使用与其他任何非静态方法相同的方法- 在定义或继承该方法的类型实例上调用它。如果是枚举,则此类实例仅为s。 因此,
我很好奇在try块中使用return语句的最佳实践。 我有一个调用服务方法的方法,该方法返回一个整数,并可能抛出一个IllegalArgumentException。有两种方法可以做到这一点。 第一: 第二: 在第二种方法中,计数变量似乎是不必要的,但出于某种原因,第一种方法在我看来是错误的。有什么特别的理由偏袒一方而不是另一方吗?
问题内容: 我正在尝试为博客平台创建一个构造函数,并且内部进行了许多异步操作。这些范围包括从目录中获取帖子,对其进行解析,通过模板引擎发送它们,等等。 所以我的问题是,让我的构造函数返回一个promise而不是调用它们的函数的对象是不明智的。 例如: 现在,用户可能 还不 提供补充的Promise链接: 这可能会带来问题,因为用户可能会感到困惑,为什么 在构造后仍然无法使用。 在构造函数中使用Pr
问题内容: 我正在尝试为博客平台创建一个构造函数,并且其中包含许多异步操作。这些范围包括从目录中获取帖子,对其进行解析,通过模板引擎发送它们,等等。 所以我的问题是,让我的构造函数返回一个promise而不是调用它们的函数的对象是不明智的。 例如: 现在,用户可能 还不 提供补充的Promise链接: 这可能会带来问题,因为用户可能会感到困惑,为什么 在构造后仍然无法使用。 在构造函数中使用Pro
我想用:调用它。但它不喜欢: