当前位置: 首页 > 知识库问答 >
问题:

在Java返回枚举是不好的做法吗?

广献
2023-03-14

假设我有一个类来为游戏中的一个项目建模,如下所示:

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名称?一般情况下返回枚举是好的做法吗?或者是否有更好的方法来区分这些items?因为返回枚举类似于向我公开rep,而且我不希望我的同事直接使用EnumItem来比较Item

我想到的办法如下:

  1. 字符串getName()执行类似item1.getName().equals(“machine_gun”)
  2. EnumItem getEnum()要执行item1.getEnum().equals(enumitem.machine_gun)
  3. item1.equals(新项目(“machine_gun”))
  4. 静态名称(字符串名称){new Item(name)}要执行item1.equals(Item.name(“machine_gun”))

我不知道该怎么做,我希望有经验的程序员能给我一些启示。

编辑:我知道它们看起来像是从上下文中得到的,但是在我的用例中,这些项没有特殊的功能来证明从基项类扩展是合理的

共有1个答案

龚宏壮
2023-03-14

这种做法好吗?当然,您使用的是聚合,因为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