Java 将值从一个枚举导入到另一个枚举?

Java 将值从一个枚举导入到另一个枚举?,java,enums,Java,Enums,现在,我有两个Enums,它们只需要有同步的值,并且它们存在于不同的项目中。我需要找到某种方法从一个枚举(Enum1)中获取值并将其导入(Enum2) Enum1.java的 package com.example.hello; import com.example.foo.SomeClass; public enum Enum1 { A(1), B(2), C(3), D(4); integer i; Enum1(int ii) { th

现在,我有两个
Enum
s,它们只需要有同步的值,并且它们存在于不同的项目中。我需要找到某种方法从一个枚举(
Enum1
)中获取值并将其导入(
Enum2

Enum1.java的

package com.example.hello;

import com.example.foo.SomeClass;

public enum Enum1 {
     A(1), B(2), C(3), D(4);

     integer i;

     Enum1(int ii) {
         this.i = ii;
     }

     public static int getValue(Enum1 e) {
         return e.i;
     }

     public int doSomething() {
         return SomeClass.doThings(i);
     }
}
同时,
Enum2.java
(在另一个项目中)当前看起来如下:

package com.example.world;

import com.example.bar.SomeOtherClass;

import static com.example.hello.Enum1.*;

public enum Enum2 {
    // Enums *should* be imported from Enum1

    integer i;

    Enum2(int ii) {
        this.i = ii;
    }

    public int doSomethingElse() {
        return SomeOtherClass.doSomethingElse(i);
    }
}
当然,这是行不通的,因为这些值并没有跨越间隙

同样的理由是在我的代码中使用
Enum1
,但是两个项目之间的enum上的函数需要完全不同

我想做的事可能吗?如果是这样的话,我如何(相对)理智地完成它


对于上下文,这两个程序将这些枚举用于权限模型。系统会检查用户是否处于或高于所需的最低权限级别,该级别可能类似于
Enum1.B
。问题是
Enum1
依赖于一个我无法导入到包含
Enum2
的项目中的类,因为必须将Java依赖项与
Enum2
的项目捆绑在一起是一种完全的浪费,特别是如果该项目由于任何原因都无法实际使用的话


最终,我们将迁移到一个更合理的权限模型,在这个模型中,整个系统将不再需要,但同时我们需要一些东西来工作,因此需要某种解决方案(或绝对肮脏的黑客),只是为了让它暂时工作。

我将通过代码生成来解决这个问题。 在包含Enum2的项目的生成过程中,读取Enum1并在生成的源文件夹中创建Enum2。所有主要的构建系统和IDE都能很好地支持生成的代码

对于实际的代码生成,您基本上有3个选项:

  • 基于模板,使用模板框架,如Velocity或Moustach
  • 基于AST,使用代码生成器框架,如
  • 使用好的旧字符串连接自行完成

我在一次会议上讨论了如何使用Groovy将JCodeModel与Maven构建集成。您可以将其作为起点。

您必须提供更多的上下文。给我们一个具体的例子,任何我们能联系到的。现在,答案是“不,不可能”。通过上下文,我们可以向您展示备选方案……是否可以将Enum1放在project1和project2都依赖的项目中?@PaulHicks不太可能,因为这样的项目不存在。虽然我可以(也可能应该)做一个,但我想避免使这个项目进一步复杂化。@blubb,我希望这能为我为什么需要这个提供足够的背景。我不经常在这里发帖,所以我不能100%确定什么是“好的”上下文,所以如果这还不够,请告诉我。从您的示例来看,似乎您真的不需要
Enum2
。想想没有它的生活。如果在第二个项目中只需要一个数字,那么就使用这个数字。如果您确实必须使用
Enum2
,那么每次
Enum1
更改时,您可能都需要检查
doSomethingElse
逻辑。在这种情况下,代码生成并不是最好的答案。您最好使用(测试时间)静态分析,该分析断言
Enum2
包含
Enum1
中的所有值。这样,您可以手动查看
doSomethingElse
,并在必要时更新
Enum2