首页 > 解决方案 > Java:枚举类构造函数

问题描述

我有一个带有两个变量的 Enum 类:int idboolean collidable.
有没有办法制作一个只接收第一个变量并正确填充第二个变量的构造函数?请注意,第一个类变量是 id,它对于 Enum 的每个类型值都不同。

public enum TileID {
    Grass(1,false),
    GrassTall(2,false),
    GrassFlower1(3,false),
    GrassFlower2(4,false),
    Water(5,false),

    GrassTwig(6,true),
    GrassRock(7,true);


    private final int id;
    private final boolean collidable;

    TileID(int id, boolean collidable) {
        this.id = id;
        this.collidable = collidable;
    }


    public int getId() {
        return id;
    }

    public boolean isCollidable() {
        return collidable;
    }
}


编辑:

我想知道是否有办法直接访问与给定 id 对应的值,但我想没有。我在另一篇文章中找到了这种方法,我想我会这样做。

public static TileID valueOf(int id) {
        return Arrays.stream(values())
                .filter(legNo -> legNo.id == id)
                .findFirst().orElse(null);
    }


感谢所有帮助过的人。

标签: java

解决方案


您可以从另一个构造函数中调用一个构造函数。

看看:如何在 Java 中从另一个构造函数调用一个构造函数?

Grass(1),
GrassTall(2),
GrassFlower1(3),
GrassFlower2(4),
Water(5),

GrassTwig(6, true),
GrassRock(7, true);

TileID(int id) {
    this(id, false); // false = default value of 'collidable'
}

TileID(int id, boolean collidable) {
    this.id = id;
    this.collidable = collidable;
}

此外,您不必每次都指定 ID。你可以:

  • 使用您递增的静态 int
  • 使用Enum#ordinal()将返回值在枚举中的“位置”

关于您的编辑:

如果您使用Enum#ordinal()快速检索相应的枚举,则有一种更快的方法。通过做:

public static TileID fromId(int id) {
    return TileID.values()[id];
}

但请注意,您可能希望保护此函数免受负值或太大值的影响。


推荐阅读