切换枚举值:case 表达式必须是常量表达式

2024-05-01

我有一个具有以下结构的枚举:

public enum Friends {
    Peter("Peter von Reus", "Engineer"),
    Ian("Ian de Villiers", "Developer"),
    Sarah("Sarah Roos", "Sandwich-maker");

    private String fullName;
    private String occupation;

    private Person(String fullName, String occupation) {
        this.fullName = fullName;
        this.occupation = occupation;
    }

    public String getFullName() {
        return this.fullName;
    }

    public String getOccupation() {
        return this.occupation;
    }
}

我现在想使用switch来确定,如果一个变量name与某一个相关联enum:

//Get a value from some magical input
String name = ...

switch (name) {
    case Friends.Peter.getFullName():
        //Do some more magical stuff
        ...
    break;
    case Friends.Ian.getFullName():
        //Do some more magical stuff
        ...
    break;
    case Friends.Sarah.getFullName():
        //Do some more magical stuff
        ...
    break;
}

这对我来说似乎完全合法,但我收到了错误case expressions must be constant expressions在 Eclipse 中。 我可以用一组简单的 if 语句来解决这个问题,但我想知道这个错误的原因以及如果允许的话事情可能会如何向南发展。

注意:我无法更改结构Friends


如果我理解你的问题,你可以使用valueOf(String) like

String name = "Peter";
Friends f = Friends.valueOf(name);
switch (f) {
case Peter:
    System.out.println("Peter");
    break;
case Ian:
    System.out.println("Ian");
    break;
case Sarah:
    System.out.println("Sarah");
    break;
default:
    System.out.println("None of the above");
}

还有,这个

private Person(String fullName, String occupation) {
    this.fullName = fullName;
    this.occupation = occupation;
}

应该

private Friends(String fullName, String occupation) {
    this.fullName = fullName;
    this.occupation = occupation;
}

Because Person != Friends.

Edit

根据您的评论,您将需要编写一个静态方法才能获得正确的结果Friends实例,

    public static Friends fromName(String name) {
        for (Friends f : values()) {
            if (f.getFullName().equalsIgnoreCase(name)) {
                return f;
            }
        }
        return null;
    }

然后你可以用以下方式调用它:

    String name = "Peter von Reus";
    Friends f = Friends.fromName(name);

valueOf(String)将匹配枚举字段的名称。所以“伊恩”、“莎拉”或“彼得”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

切换枚举值:case 表达式必须是常量表达式 的相关文章

随机推荐

  • 模拟器在 AQMEIOManager 上崩溃

    尝试播放音频时模拟器崩溃 13 22 14 211 App 2965 5603 lt 0xb03e7000 gt Error obj trying to fetch default input device s sample rate 13
  • mailto 的语法

    当使用这样的 mailto 链接时 a href title Subject Link Text a 是否可以设置 FROM 地址 更新 我忘了提及 我有一群忠实的受众 他们都将使用 IE8 和 Outlook 不幸的是 事实并非如此 您只
  • 计算 IOrderedEnumerable 的数量而不消耗它

    我想做的 简短版本 var source new 2 4 6 1 9 OrderBy x gt x int count source Count lt get the number of elements without performin
  • 使用 MVVM 为 WPF 搭建脚手架?

    谁能告诉我是否可以 如果存在某些实用程序 创建考虑到 MVVM 和 WPF 的脚手架 我的想法是我似乎有很多数据访问表单 当然我想自定义它们 但最初我想要一种快速提供表单的方法 即放置在它们上面并绑定到 mvvm 的所有控件 也许我问得很多
  • javascript单线程时onreadystatechange的调用者是谁?

    好吧 我是 javascript 的新手 听说它是单线程的 在我看来 如果您发出异步请求 它应该启动一个自己的线程来控制服务器是否已经响应 这在 JavaScript 中不起作用 我在想是否有一些内置机制可以保存所有侦听器并调用它们 具体取
  • 在github原子编辑器中隐藏隐藏(点)文件

    我对 Github Atom 编辑器非常陌生 它总是显示隐藏文件 例如 git sass在侧窗格中 如何在atom编辑器的侧窗格中隐藏隐藏文件 点文件 编辑 gt 首选项 gt 包 在 已安装的软件包 下面的字段中 输入 树视图 该软件包有
  • 在 Java 中打印 HashMap

    我有一个HashMap private HashMap
  • 复制cordova 2.2.0 .jar

    我需要新的 jar 文件来升级到 cordova 2 2 0 但我在哪里可以找到它呢 我必须生成它吗 如何生成 多谢 您可以从以下位置下载 PhoneGap GitHub 存储库 https github com phonegap phon
  • 如何在java中使用cypher加载CSV文件?

    我是密码新手 我想在java中使用cypher加载csv 我用谷歌搜索并找到了以下作品 LOAD CSV WITH HEADERS FROM http neo4j com docs 2 3 1 csv import movies csv A
  • aws cli 中的 SSL CERTIFICATE_VERIFY_FAILED

    我安装了AWS CLI http docs aws amazon com cli latest userguide installing html install msi on windows在 Windows Server 2007 32
  • 使用 Peewee 追溯创建索引?

    有没有办法用 Peewee 追溯索引 sql 文件的列 即初始规范未建立索引的情况 询问是因为执行所有插入然后建立索引应该更快 而不是相反 有没有办法用 Peewee 追溯索引 sql 文件的列 Yes Pewee s http docs
  • jax-rs ContextResolver 理解

    但我试图了解 jax rs 中 Provider 的用法 但无法理解如何使用 ContextResolver 有人可以用一些基本的例子来解释这一点吗 您将看到它在解析序列化上下文对象时被大量使用 例如一个ObjectMapper用于 JSO
  • 将电子邮件签名添加到电子邮件通知脚本

    我正在 Google Apps 脚本上编写一段代码 以便每次在我的网站上发布新公告时发送电子邮件 这是供参考的代码 var url of announcements page https sites google com announcem
  • 如何在 Python 中使用 PIL 将一张图像合成到另一张图像上?

    我需要拍摄一张图像并将其放置到新生成的白色背景上 以便将其转换为可下载的桌面壁纸 所以这个过程是这样的 生成尺寸为 1440x900 的新的全白图像 将现有图像放在顶部居中 另存为单张图像 在 PIL 中 我看到ImageDraw对象 但没
  • SQL SERVER 和 SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON

    所以我在创建脚本时一直盲目地使用ansi nulls on quoted identifier on 因为sqlserver在编写对象脚本时会自动生成它们 我真的没有时间关心这些琐碎的废话 但我想必须提出这些问题 鉴于这些是推荐的设置 是否
  • 角度`@Host`装饰器没有到达顶部?

    在我的主要app ts我已宣布成为全球提供商 providers provide Dependency useValue createDependency AppModule provider Where createDependency只
  • Android:在 setSelecton 上突出显示列表中的项目

    我有一个 ListView 和 listselector xml 最初我使用 setSeletion position 设置该项目 但使用此代码该项目不会突出显示 仅当我单击某个项目时它才会突出显示 ArrayAdapter
  • 根据上一行(data.table)中的值计算单元格中的值的快速方法

    假设我有以下数据集dt和一个常数constant dt lt structure list var1 c 92186 7470607738 19163 5035325072 18178 8396858014 9844 67882723287
  • 是否可以从联合中排除空对象?

    我有两种类型的联合 其中一种是空对象 type U a number b string c boolean 但是我想从联合中排除空对象Exclude没有帮助 type A Exclude
  • 切换枚举值:case 表达式必须是常量表达式

    我有一个具有以下结构的枚举 public enum Friends Peter Peter von Reus Engineer Ian Ian de Villiers Developer Sarah Sarah Roos Sandwich