【问题标题】:java - return String with switch casejava - 返回带有开关盒的字符串
【发布时间】:2020-01-10 00:08:06
【问题描述】:

我第一次尝试使用枚举。 对于某些测试,我想覆盖我的枚举的 toString 方法并返回一个带有所选枚举的字符串。

到目前为止,这是我的代码:

@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 在我的案例下划线并告诉我以下内容:“不是声明” => 我想这是有道理的,如果不允许使用 switch 构建 String - case。

到目前为止一切顺利,但似乎不可能返回通过 switch case 构建的字符串,还是我在返回时犯了错误? 返回所选枚举的任何其他选项? 我可以添加一个属性来保存我选择的枚举名称,但我可以这样做更简单一些。

感谢您的帮助

【问题讨论】:

  • "到目前为止一切顺利,但似乎不可能返回通过 switch case 构建的字符串" - 你是如何得出这个结论的?你有编译器异常吗?运行时异常?如果是这样,请包括编译器错误/堆栈跟踪。 --- 两句话: - 你看过Enum#ordinal()吗? - 你应该习惯用英文编写代码,至少只要你的域有可接受的翻译(typetireshpweight,...)
  • IntelliJ 在我的案例下划线并告诉我以下内容:“不是声明”猜猜这是有道理的,如果不可能返回 switch 案例生成的字符串。
  • ... 请通过editing 您的问题包括编译器错误。还有一点:代码原样似乎不可扩展,因此违反了Open-Closed Principle。我建议将Enum 转换为一个类。与一些 Builders 一起,您可以实现相同的行为,但更具可扩展性(例如,您的列表缺少电动滑板车和坦克 ????)
  • 还有两个: - 在您的toString() 实现中,您以"Fahrzeuge""vehicles",复数)开头String,但String 实际上只代表一个@987654337 @ ("vehicle")。 - 属性reifen (tires):这太笼统了。这是轮胎的类型吗?品牌?数量?更具体,例如在你的情况下"anzahlReifen" ("numOfTires")。
  • 为什么您的枚举中除了数字之外的所有内容都有字段?只需添加它,你会没事的。此外,它是带有两个“r”的“Motorrad”。

标签: java switch-statement return expression switch-expression


【解决方案1】:

根据JEP 325,可以返回从 Java 12 开始的 switch 语句的值。检查您的 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 +
            "}";

【讨论】:

  • 供参考:这个 JEP 是 Project Amber 的一部分(等不及它的 GA)
  • 开关(this)在任何其他方法中都适用于我。问题在于,我无法使用 switch 构建我的返回字符串 - 案例来获取字符串的一部分。
  • 是的,这就是我的回答所说的:您不能在旧版本的 Java 中将它用作表达式(例如 return)的一部分。确定:您使用的是什么版本?
  • @lain91 如前所述,默认开关是statement,而不是expression。语句没有值,因此不能在赋值的右侧使用它们。
  • @ÓscarLópez 好吧,现在我明白了。谢谢,我使用 IntelliJ 的默认设置,即 SDK - 12(猜猜这是 Java - 12?)
【解决方案2】:

我认为你真的不需要 switch 语句,因为枚举的超类已经知道你的“类型”的名称:

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

只需调用超类的 toString() 方法,即可获得当前选择的枚举类型的字符串值。你甚至可以删除你的类型字符串。

【讨论】:

  • 谢谢,这是我正在寻找的解决方案!但我也了解到,开关不应该在表达式的右侧编码:)
猜你喜欢
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多