java - вернуть строку с регистром переключателя

Я впервые попробовал использовать перечисление. Для некоторых тестов я хочу переопределить метод toString моего перечисления и вернуть String с выбранным перечислением.

Вот мой код:

@Override
public String toString()
{
    return "Fahrzeuge{" +
            switch(this)
            {
                case MOTORAD: "1"; break;
                case LKW: "2"; break;
                case PKW: "3"; break;
                case FAHRRAD: "4"; break;
            }
            +
            "typ:" + this.typ +
            ", ps:" + this.ps +
            ", reifen:" + this.reifen +
            ", gewicht:" + this.gewicht +
            "}";
}

IntelliJ подчеркивает мои случаи и сообщает мне следующее: «Not a Statement» => Я думаю, это имеет смысл, если не разрешено строить String с переключателем - case.

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

Спасибо за помощь


person lain91    schedule 07.09.2019    source источник
comment
Пока все хорошо, но кажется, что невозможно вернуть String, созданную с помощью корпуса переключателя - Как вы пришли к такому выводу? Вы получаете исключение компилятора? Исключение во время выполнения? Если да, включите ошибку компилятора / трассировку стека. --- Два замечания: - Вы видели _ 1_? - Вам следует привыкнуть писать свой код на английском языке, по крайней мере, до тех пор, пока для вашего домена есть приемлемые переводы (type, tires, hp, weight, ...)   -  person Turing85    schedule 07.09.2019
comment
IntelliJ подчеркнет мои кейсы и скажет мне следующее: Не утверждение. Угадайте, что это имеет смысл, если невозможно вернуть строку, сгенерированную случаем переключения.   -  person lain91    schedule 07.09.2019
comment
... Пожалуйста, включите ошибку компилятора, отредактируйте свой вопрос. Еще одно замечание: код как есть не кажется расширяемым, что нарушает Open -Закрытый принцип. Я бы предложил превратить Enum в класс. Вместе с некоторыми Builders вы можете добиться того же поведения, но более расширяемого (например, ваш список отсутствует Электросамокаты и танки ????)   -  person Turing85    schedule 07.09.2019
comment
И еще два: - в вашей toString()-реализации вы начинаете String с "Fahrzeuge" ("vehicles", множественное число), но String фактически представляет только ОДИН "Fahrzeug" ("vehicle"). - Атрибут reifen (tires): слишком общий. Это тип шин? Бренд? Количество? Будьте более конкретными, например, в вашем случае "anzahlReifen" ("numOfTires").   -  person Turing85    schedule 07.09.2019
comment
Неважно, насколько понятны имена. Этот код предназначен только для меня и некоторой практики кодирования. Пока спасибо, но я не вижу здесь решения своего вопроса.   -  person lain91    schedule 07.09.2019
comment
Ну .. это комментарии, а не ответ, не так ли ????? Оскар уже ответил на ваш вопрос. Я ставлю под сомнение ваш общий дизайн, то есть использование Enum таким образом, и просмотрел ваш код.   -  person Turing85    schedule 07.09.2019
comment
Почему в вашем перечислении есть поля для всего, кроме числа? Просто добавьте его, и все будет в порядке. Кроме того, это Motorrad с двумя RS.   -  person daniu    schedule 07.09.2019


Ответы (2)


Я думаю, вам действительно не нужен оператор switch, потому что суперкласс перечисления уже знает имя вашего «типа»:

@Override
public String toString()
{
    return "Fahrzeuge: " + super.toString() +
            ", ps:" + this.ps +
            ", reifen:" + this.reifen +
            ", gewicht:" + this.gewicht;
}

Просто вызовите метод toString () суперкласса, и вы получите строковое значение вашего текущего выбранного типа перечисления. Вы даже можете удалить строку своего типа.

person CuriousFly    schedule 07.09.2019
comment
Спасибо, это решение, которое я искал! Но я также узнал, что переключатель не должен указываться в правой части выражения :) - person lain91; 07.09.2019

Можно вернуть значение оператора switch, начиная с Java 12, в соответствии с JEP 325. Проверьте свою версию Java, если она меньше 12, тогда вы не можете использовать switch таким образом, и вам придется сначала прибегнуть к сохранению предполагаемого значения в локальной переменной. Я хочу сказать, что если ваша версия java старше 12, вы должны сделать это:

String num = "";
switch (this)
{
    case MOTORAD:
        num = "1";
        break;
    case LKW:
        num = "2";
        break;
    case PKW:
        num = "3";
        break;
    case FAHRRAD:
        num = "4";
        break;
}

return "Fahrzeuge{" + num +
            "typ:" + this.typ +
            ", ps:" + this.ps +
            ", reifen:" + this.reifen +
            ", gewicht:" + this.gewicht +
            "}";

Но если у вас установлена ​​Java 12 (или выше), вы можете сделать это (обратите внимание на другой синтаксис!):

return "Fahrzeuge{" +
            switch (this)
            {
                case MOTORAD -> "1";
                case LKW     -> "2";
                case PKW     -> "3";
                case FAHRRAD -> "4";
            }
            + "typ:" + this.typ +
            ", ps:" + this.ps +
            ", reifen:" + this.reifen +
            ", gewicht:" + this.gewicht +
            "}";

И обратите внимание, что если числа соответствуют порядку, в котором были объявлены значения перечисления, вы можете просто использовать ordinal():

return "Fahrzeuge{" + this.ordinal() +
            "typ:" + this.typ +
            ", ps:" + this.ps +
            ", reifen:" + this.reifen +
            ", gewicht:" + this.gewicht +
            "}";
person Óscar López    schedule 07.09.2019
comment
Для справки: этот JEP является частью Project Amber (не могу дождаться его GA) - person Turing85; 07.09.2019
comment
Переключатель (этот) у меня хорошо работает в любом другом методе. Проблема в том, что я не могу построить свою возвращаемую строку с помощью переключателя, чтобы получить часть строки. - person lain91; 07.09.2019
comment
Да, мой ответ гласит: вы не можете использовать его как часть выражения (например, return) в более старых версиях Java. Чтобы быть уверенным: какую версию вы используете? - person Óscar López; 07.09.2019
comment
@ lain91, как было сказано, переключатель по умолчанию - это инструкция, а не выражение. У операторов нет значений, поэтому вы не можете использовать их в правой части присваивания. - person Turing85; 07.09.2019
comment
@ ÓscarLópez, ладно, теперь я понял. спасибо, я использую настройки по умолчанию в IntelliJ, то есть SDK-12 (думаю, это Java-12?) - person lain91; 07.09.2019
comment
@ lain91 проверьте все мои ответы, но попробуйте три варианта. Если второй работает, то да, у вас установлена ​​Java 12 :). Но лично я предпочел бы использовать третий вариант. - person Óscar López; 07.09.2019