Java中的枚举基类

B-F*_*ir3 6 java enums subclass

使用它作为Enum like类的基类的最佳方法是什么.我希望能够创建不同的具体类型,而无需重新编写getter方法.

public enum Tool extends Item
{
    Pickaxe("Pickaxe", 101),
    Saw("Saw", 201);
}
Run Code Online (Sandbox Code Playgroud)

Tool.getNames()将返回Tool类中所有Item名称的列表.

public enum Item
{
    Default("Name", 0);

    private final int id;
    private final String name;

    Item(String name, int id)
    {
        this.id = id;
        this.name = name;
    }

    public int getId()
    {
        return this.id;
    }

    public int[] getIds()
    {
        Item[] items = Item.values();
        int[] ids = new int[items.length];
        for (int i = 0; i < items.length; i++)
        {
            ids[i] = items[i].getId();
        }
        return ids;
    }

    public String getName()
    {
        return this.name;
    }

    public String[] getNames()
    {
        Item[] items = Item.values();
        String[] names = new String[items.length];
        for (int i = 0; i < items.length; i++)
        {
            names[i] = items[i].getName();
        }
        return names;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道不可能这样,但我怎么能处理这种情况呢?我希望能够像访问枚举一样访问每个类的成员:Tool.Pickaxe.

ski*_*iwi 5

您将必须自己实现,您不能扩展已经实现的行为。但是,您可以强迫自己或其他任何人实施各种方法:

public interface Item {
    public int getId();
    public String getName();
}
Run Code Online (Sandbox Code Playgroud)
public enum Tool implements Item {
    Pickaxe("Pickaxe", 101),
    Saw("Saw", 201);

    private final int id;
    private final String name;

    public Item(final String name, final int id) {
        this.id = id;
        this.name = name;
    }

    @Override
    public int getId() {
        return id;
    }

    @Override
    public String getName() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是第一部分,现在你不想要访问getIds(),并getNames()通过枚举“实例”本身,而是要通过类访问它们作为一个静态函数。

我希望这已经对您有所帮助,但是它还远远不够完整,对于泛型,甚至可能有一些方法可以使它更简单,但是一定要理解枚举不能扩展任何内容。