Java: конструктор класса Enum - PullRequest
1 голос
/ 20 июня 2020

У меня есть класс Enum с двумя переменными: int id и boolean collidable. Есть ли способ создать конструктор, который принимает только первую переменную и правильно заполняет вторую? Обратите внимание, что первая переменная класса - это идентификатор, и он отличается для каждого значения типа 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;
    }
}

Изменить:

Я хотел знать, есть ли способ получить прямой доступ к значению, соответствующему заданному идентификатору, но я думаю, что его нет. Я нашел этот метод в другом посте и думаю, что сделаю это вместо него.

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

Спасибо всем, кто помог.

Ответы [ 2 ]

7 голосов
/ 20 июня 2020

Вы можете вызывать один конструктор из другого.

Взгляните на: Как мне вызвать один конструктор из другого в 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;
}

Более того, вам не нужно каждый раз указывать идентификаторы. Вы можете:

  • Использовать stati c int, который вы увеличиваете
  • Использовать Enum # ordinal () , который вернет, в каком 'положении' значение находится в перечислении

О ВАШЕМ РЕДАКТЕ:

Существует более быстрый метод, если вы используете Enum # ordinal () , чтобы быстро получить соответствующее перечисление. Сделав:

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

Но имейте в виду, что вы можете защитить эту функцию от отрицательных или слишком больших значений.

3 голосов
/ 20 июня 2020

Конечно, вы всегда можете установить поле collidable в соответствии с идентификатором, используя if или switch, если нет констант с тем же полем id, но разными значениями для collidable field.

Просто сделайте

TileID(int id) {
    this.id = id;
    this.collidable = id > 5; //or some other condition
}

А затем опустите второй аргумент в ваших константах (Grass(1), GrassTall(2), ...;).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...