Java:使用整数常量声明枚举时遇到问题

2023-11-24

呃,我对 Java 中枚举的工作原理有点困惑。在 C# 和 C++(我通常使用的)中,这似乎没问题,但 Java 想要生我的气 >.>

   enum Direction
   {
      NORTH_WEST = 0x0C,
      NORTH      = 0x10,
      NORTH_EAST = 0x14,
      WEST       = 0x18,
      NONE       = 0x20,
      EAST       = 0x28,
      SOUTH_WEST = 0x24,
      SOUTH      = 0x30,
      SOUTH_EAST = 0x3C
   }

有人可以告诉我我做错了什么吗? 谢谢

以下是错误:

 ----jGRASP exec: javac -g Test.java

Test.java:79: ',', '}', or ';' expected
      NORTH_WEST = 0x0C,
                 ^
Test.java:79: '}' expected
      NORTH_WEST = 0x0C,
                  ^
Test.java:80: <identifier> expected
      NORTH      = 0x10,
           ^
Test.java:87: ';' expected
      SOUTH_EAST = 0x3C
                       ^

对于这种情况,看起来您可以简单地使用实例字段.

public enum Direction {
   NORTH(0x10), WEST(0x18), ...;

   private final int code;
   Direction(int code)  { this.code = code; }
   public int getCode() { return code; }
}

Java enum被实现为对象。它们可以有字段和方法。您还可以选择声明一个带有一些参数的构造函数,并在常量声明中为这些参数提供值。您可以使用这些值来初始化任何声明的字段。

See also

  • Java 语言指南/枚举- 快速而全面的 Java 指南enum

附录:EnumSet and EnumMap

请注意,根据这些值的不同,您可能有比实例字段更好的选择。也就是说,如果您尝试设置位字段的值,您应该只使用EnumSet反而。

在 C++ 中,经常会看到两个常量的幂与按位运算作为集合的紧凑表示。

// "before" implementation, with bitwise operations

public static final int BUTTON_A = 0x01;
public static final int BUTTON_B = 0x02;
public static final int BUTTON_X = 0x04;
public static final int BUTTON_Y = 0x08;

int buttonState = BUTTON_A | BUTTON_X; // A & X are pressed!

if ((buttonState & BUTTON_B) != 0) ...   // B is pressed...

With enum and EnumSet,这可能看起来像这样:

// "after" implementation, with enum and EnumSet

enum Button { A, B, X, Y; }

Set<Button> buttonState = EnumSet.of(Button.A, Button.X); // A & X are pressed!

if (buttonState.contains(Button.B)) ... // B is pressed...

还有EnumMap您可能想要使用。它是Map谁的钥匙是enum常数。

那么,和以前一样,您可能会遇到这样的情况:

// "before", with int constants and array indexing

public static final int JANUARY = 0; ...

Employee[] employeeOfTheMonth = ...

employeeOfTheMonth[JANUARY] = jamesBond;

现在您可以拥有:

// "after", with enum and EnumMap

enum Month { JANUARY, ... }

Map<Month, Employee> employeeOfTheMonth = ...

employeeOfTheMonth.put(Month.JANUARY, jamesBond);

在爪哇,enum是一个非常强大的抽象,也可以很好地与 Java 集合框架配合使用。

See also

  • Java 教程/集合框架
  • Effective Java 2nd Edition
    • 第 30 项:使用enum代替int常量
    • 第 31 项:使用实例字段代替序数
    • 第 32 项:使用EnumSet而不是位域
    • 第 33 项:使用EnumMap而不是顺序索引

相关问题

  • 枚举:为什么?什么时候?- 举例说明EnumSet and EnumMap usage
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:使用整数常量声明枚举时遇到问题 的相关文章

  • LoaderManager 不接受“这个”

    好吧 我投降 我想不明白 我正在学习 Udacity 的 Android 基础知识课程 需要了解如何使用加载器加载数据 但是 当我使用以下行时 this 以红色突出显示并显示以下错误 Wrong 3rd argument type Foun
  • Java 的 RSA 算法库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想为我的应用程序提供基于 RSA 算法的简单许可机制 有免费的 RSA 库吗 只需使用javax crypto and java sec
  • 范围内的春季活动可能吗?

    Spring 事件机制支持发布应用程序事件并通过 Spring 组件监听这些事件 EventListener注解 但是 我在 中找不到有关在特定范围内发送事件的任何信息文档 https docs spring io spring docs
  • 如何在Android上创建原生C++库?

    我需要用C 编写一个动态链接库 供Android上的Java使用 据我所知 它应该是 so 库 但我不知道该怎么做 我尝试了 Cygwin 但它崩溃了 海湾合作委员会1 cpp usr lib gcc i686 pc cygwin 4 3
  • 从 QueryDSL 谓词对象中获取参数

    我使用带有 Spring REST 端点的 QueryDSL 谓词对象来检索和查询参数值 GetMapping subjectId students RolesAllowed Roles PLATFORM ADMIN Roles USER
  • Java中如何存储profile?

    我仍在学习 Java 的诀窍 如果有一个明显的答案 我很抱歉 我有一个占用大量内存的程序 我想找到一种方法来减少其使用 但是在阅读了许多 SO 问题后 我认为在开始优化它之前我需要证明问题出在哪里 这就是我所做的 我在程序的开头添加了一个断
  • 异步方法的默认 EJB 事务模式?

    当我有一个 AsynchronousEJB 中的方法 并且我没有指定 TransactionAttribute 那么容器到底是如何处理事务边界的呢 显然 它不能使用调用线程的事务 那么它是做什么的呢 同样的问题 但涉及由 TimerServ
  • 在手机上单步执行 Android 代码 - 大行号差异

    我正在尝试调试与 Samsung Captivate Galaxy S 上的 ListView 相关的一些代码 我在代码中的某个位置放置了断点 当它停止时 我会在堆栈上返回几帧到 ListView 源 现在 我可以预期会出现一些不匹配的情况
  • 使用 Spring RestTemplate 时忽略 SSL 证书验证

    我正在使用 Spring RestTemplate 发出 HTTPS 请求 并且我想忽略 SSL 证书 这是我创建restTemplate请求的代码 TrustStrategy acceptingTrustStrategy X509Cert
  • Java 字节码中循环的检测 - 区分后沿类型

    背景 在提出问题之前 我想声明我已检查以下链接 识别java字节码中的循环 https stackoverflow com questions 6792305 identify loops in java byte code Java 字节
  • Hibernate添加带有子实体id的实体

    我的对象 状态 java Entity Table name STATE public class State Id GeneratedValue strategy GenerationType AUTO private Long id C
  • java.util.Prefs 抛出 BackingStoreException - 为什么?

    我有一个系统可以缓存启动时 SOAP 调用的微小 简单结果 我需要实例能够在启动时重新加载其缓存 以防 SOAP 服务失效 并且还需要处理使用此缓存文件的多个实例的可能性 我选择使用java util prefs但是 Java 的内置自动同
  • JPanel 上的圆形边框

    我这里得到的是一个带有圆形边框的 JPanel 其设置如下 panel setBorder new LineBorder PanelColor 5 true 问题是 在每个角上都有 2 条从外角到内角的对角不透明线 即边框的长度 边界后面的
  • 使用 int 作为 java.util.Dictionary 的类型参数

    当我尝试这样声明字典时 private Dictionary
  • Resilience4j 重试 - 记录来自客户端的重试尝试?

    是否可以使用resilience4j在客户端记录重试尝试 也许通过某种配置或设置 目前 我正在将resilience4j与Spring boot Webflux一起使用基于注释 它运作良好 该项目很棒 当我们将服务器日志放在服务器端时 为了
  • jdbcAuthentication() 而不是 inMemoryAuthentication() 不提供访问权限 - Spring Security 和 Spring Data JPA

    我只是使用 spring mvc gradle spring security spring data jpa 创建简单的应用程序 现在我想测试 spring security 是如何工作的 但是我有一个问题 首先我向您展示一些代码 然后我
  • XStream:xstream 1.3.1 中具有属性和文本节点的节点?

    我想使用 XStream 将对象序列化为这种形式的 XML
  • 无法在 Windows 7 64 位中正确设置 java 路径

    我已经在计算机中安装了 java 1 6 并且还使用高级变量设置设置了路径 当我尝试执行 java 时 在命令提示符下出现此错误 Error could not open C Program Files Java jre7 lib amd6
  • JavaFX - 当文本字段具有焦点时加速器不工作

    在我的应用程序中 我有一个使用加速器的屏幕 我正在使用功能键 F3 在我的应用程序中执行操作 它每次都工作正常 但是当我单击此屏幕上的任何文本字段时 功能键不会执行 这是我设置加速器的代码 scene getAccelerators put
  • Java - 类型转换问题

    long a long Math pow 2 32 a 4294967296 long a int long Math pow 2 32 a 0 long a int Math pow 2 32 a 2147483647 WTF 第一个表达

随机推荐

  • java中的KeyPressed事件

    我刚刚创建了一个java tic tac toe 游戏 我想弄清楚在特定条件下按下回车键后如何运行一个方法 示例如下 if condition is met keyListener 根据您想要捕获 enter 键的位置 您可以使用Actio
  • 清除 Magento 缓存

    我正在使用 Magento 1 6 1 版 我需要以编程方式清除 Magento 缓存 Mage app gt getCache gt clean 我使用了上面的代码 但它没有清除缓存 try this Mage app gt cleanC
  • 如何正确更新我的图表值? (实时)

    我最近遇到了一个名为 LiveChart 的工具 并决定对其进行测试 不幸的是 我在弄清楚如何实时更新图表值时遇到了一些问题 我很确定有一种干净且正确的方法可以做到这一点 但我无法找到它 我希望能够通过更新值private void或按钮
  • ExtJs:在组合框中搜索/过滤

    我在 ExtJs 2 3 中遇到以下问题 我想在组合框中进行搜索 我给你举个例子 Ext comboData names Peter Paul Amanda var store new Ext data SimpleStore fields
  • surfaceView.getHolder 不返回 SurfaceHolder

    我正在尝试编写一个使用相机的应用程序 当尝试获取最终传递给启动相机的 surfaceCreated 的 surfaceHolder 时 我收到 NullPointerException getHolder 是否有返回NULL的情况 than
  • 如何连接 sparql 中的值列表?

    假设我有一个urihttp dbpedia org page Manmohan Singh现在他的标签 dbpprop years 中有一个年份列表 当我写一个查询时 PREFIX rdf
  • 在匿名方法中使用 MethodInfo.GetCurrentMethod()

    public static void Main string args Action a gt Console WriteLine MethodInfo GetCurrentMethod Name a 这段代码将返回一个模糊的字符串 如下所
  • CORS - 是客户端、服务器端还是传输层? [复制]

    这个问题在这里已经有答案了 我试图理解CORS 根据我的理解 它使您能够限制哪些域可以访问服务器上的资源 然而 这似乎并不是故事的全部 例如 我有一个未启用 CORS 的 Web 服务 我无法通过 jQuery 从我的 Web 应用程序访问
  • 具有自签名证书的 Python 3 urllib

    我正在尝试使用 Python 从内部服务器下载一些数据 由于它是内部的 因此它使用自签名证书 我们不想为永远不会出现在 野外 的服务器付费 Python 2 6 版本的代码运行良好 response urllib2 urlopen URL
  • ReactJS:警告:setState(...):无法在现有状态转换期间更新

    我正在尝试从渲染视图重构以下代码
  • Python内存映射

    我正在处理大数据 并且我的矩阵大小约为 2000x100000 因此为了更快地工作 我尝试使用 numpy memmap 来避免由于 RAM 限制而在内存中存储这么大的矩阵 问题是 当我将相同的矩阵存储在两个变量中时 即一个使用 numpy
  • 在 Rails 中存储应用程序特定配置的最佳方法是什么?

    我需要在 Rails 中存储应用程序特定的配置 但它必须是 可在任何文件 模型 视图 助手和控制器 中访问 指定 或未指定 环境 这意味着每个环境都可以覆盖environment rb中指定的配置 我尝试使用environment rb并放
  • 致命错误:未找到类“Illuminate\Foundation\Application”

    当我打开使用 laravel 5 制作的网站时出现以下错误 致命错误 在第 14 行的 C cms bootstrap app php 中未找到 Illuminate Foundation Application 类 我尝试删除供应商文件夹
  • 在运行时加载 Java 字节代码

    我得到了一些在我的程序中生成的java字节代码 因此编译了java源代码 现在我想将此字节码加载到当前运行的 Java VM 中并运行特定的函数 我不知道如何实现这一点 我深入研究了 Java 类加载器 但没有找到直接的方法 我找到了一个解
  • 在 Android 模拟器上通过 appium 或 adb 启用“show_touches”

    是否可以从 appium 启用 android 上的 show touches 选项 还是通过adb 我有一个 appium 测试脚本 它的行为不正常 我不知道为什么 我想看看它到底在哪里点击 adb shell settings put
  • Apollo 客户端:变量未定义。收到状态码 400

    我正在尝试使用 Apollo 客户端在 GraphQL 查询中使用动态变量 我已遵循文档 但 Apollo 不断给我错误 说我的变量未定义 并最终以状态代码 400 进行响应 Apollo 的文档是这样说的 mutate 选项 Mutati
  • Rails 应用程序中的 Cookie 溢出?

    UsersController create 中的 ActionDispatch Cookies CookieOverflow 当我尝试打开该页面时出现此错误 我不知道如何调试这个错误 您对这个问题有什么建议吗 def create use
  • 如何获取 VSS 快照的“NextUSN”日志条目?

    创建 VSS 快照后 我希望能够查询 USN 日志 这是否可能 或者 USN 日志是否无法从 VSS 快照访问 my goal 是能够在两个 VSS 快照之间的增量备份中使用 USN 日志 备份的过程是 拍摄 VSS 快照并备份卷 记下每个
  • 如何在 Excel VBA 中使用 .NET 对象?

    VBA 代码可以实例化和使用 NET 对象吗 我感兴趣的具体类是 System IO Compression GZipStream For InfoGAC 是 NET 全局程序集缓存 我认为 Andy 明确了这个答案 但我不确定有关 CLR
  • Java:使用整数常量声明枚举时遇到问题

    呃 我对 Java 中枚举的工作原理有点困惑 在 C 和 C 我通常使用的 中 这似乎没问题 但 Java 想要生我的气 gt gt enum Direction NORTH WEST 0x0C NORTH 0x10 NORTH EAST