繁体   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