枚举与类加载器

发布于 2024-10-04 18:48:36 字数 61 浏览 1 评论 0原文

有时您甚至可能不知道您插入代码的环境有多个类加载器。在这种情况下,我仍然可以期望操作“==”适用于枚举值吗?

Sometimes you may even not know that the environment you plug you code in has more than one class loader. May I still expect that operation "==" will work on enum values in this case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

仲春光 2024-10-11 18:48:36

多个类加载器可能不是问题,只要枚举只能通过其中之一使用。如果不是这种情况,您将失去枚举的所有好处。

顺便说一句,使用 equals() 也没有帮助。以下是 Java 1.6 中 Enum.equals(Object) 的实现:

public final boolean equals(Object other) { 
    return this==other;
}

Multiple classloaders may not be the problem, as long as the enum is only available through one of them. If that is not the case, you lose all the benefits of an enum.

And by the way, using equals() doesn't help either. Here's the implementation of Enum.equals(Object) in Java 1.6:

public final boolean equals(Object other) { 
    return this==other;
}
一笔一画续写前缘 2024-10-11 18:48:36

如果您的枚举类仅加载一次,它仍然可以工作。

  • 您的枚举仅在加载的插件中使用,
  • 枚举已由各个插件类加载器的父类加载器加载

如果您的枚举类由不同的类加载器加载,它将不起作用

  • 您在不同的插件之间传递枚举值,但应用程序类加载器尚未加载枚举。 (如果枚举值从不在插件之间交叉,它仍然可以工作)

这样做的原因

Java 使用对象实例来表示不同的枚举值,每个实例都存储为静态字段枚举类。如果枚举加载两次,每个枚举值将由两个不同的对象实例表示。 == 运算符 仅比较引用,并不知道代表枚举值的多个实例,因此它无法匹配不同类加载器加载的值。

If your enum class is only loaded once it will still work.

  • your enum is only used within the loaded plugin
  • the enum has been loaded by a parent classloader of the individual plugin classloaders

If your enum class is loaded by different classloaders it will not work

  • you pass the enum values between different plugins but the application classloader has not loaded the enum. (it can still work if the enum values never cross between plugins)

The reason why it is this way

Java uses object instances to represent the different enum values, each of these instances is stored as a static field within the enum class. If the enum is loaded twice each enum value is represented by two different object instances. The == operator only compares the references and is unaware of the multiple instances representing an enum value, so it will fail to match values loaded by different classloaders.

卷耳 2024-10-11 18:48:36

"==" 不起作用,但无论如何你都想使用 .equals()

您可能对 apache commons lang 类感兴趣: 链接文字

"==" will not work, but you want to use .equals() anyway.

You might be interested in the apache commons lang class: link text

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文