Java 将枚举转换为具有常量的类

Java 将枚举转换为具有常量的类,java,intellij-idea,Java,Intellij Idea,是否有IntelliJ重构允许自动将枚举转换为类,从而将其枚举值转换为静态final字段 我似乎找不到关于它的任何东西,我只找到了关于提取常数的东西,但没有找到我要找的东西 我要找的例子 例如,我想打开如下枚举: public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6), MARS (6.

是否有IntelliJ重构允许自动将枚举转换为类,从而将其枚举值转换为
静态final
字段

我似乎找不到关于它的任何东西,我只找到了关于提取常数的东西,但没有找到我要找的东西

我要找的例子 例如,我想打开如下枚举:

public enum Planet {

    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    // getters here
}
进入这样一个班级:

public class Planet {
    public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
    public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);    
    public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);    
    public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);    
    public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);    
    public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);    
    public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);    
    public static final Planet NEPTUNE = new Planet(1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms    
    private final double radius; // in meters

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    // getters here
}
如果你想知道为什么有人想这么做。。。
  • 如果枚举一开始就不应该是枚举(无论出于什么原因,有人声明它是枚举)
  • 让它扩展另一个类
  • 从数据库中获取枚举值,而不是在声明中硬编码它们(尽管我不得不承认,在这种情况下,我们只需要删除所有枚举值,并将
    enum
    关键字更改为
    class
    ,无需如此复杂的重构)

注意:有人做出更改的原因当然是离题的,请避免在本帖中讨论。

As@RC。尽管如此,看起来目前还没有这样的重构功能


最后,我按照建议手动使用并键入了内容。

我找不到指向它的链接。但是,有人说Java 9或10没有从
enum
类继承enum类(所有的“enum”都是“自动隐藏扩展enum的类”(不是引号,而是一种简单的方式)。从而允许
扩展
正常工作。我认为它甚至在Java8中被讨论过,但是在寻找更坚如磐石的impl时被搁置了。兰姆达等

因此,如果将来您可以扩展enum,我也不会感到惊讶


编辑:

(本以为这是在这里,但没有注意到我上一次的编辑。)

我做过这件事,只是使用Notepad++、Kate、Eclipse(无论我当时使用什么编辑器)中的“替换”功能,或者使用gnu的awk命令来进行字符串操作。(我做过很多类似的操作。使用了各种方法)一旦你学会了一些基本的正则表达式,像这样操作字符串文件就很容易了

例如,您要替换(如果在IDE/编辑器中,则在顶行的“仅选择”内)

1)
带有
公共静态最终行星

2)
=新行星(

3) 将单词
enum
更改为
class


您已经完成了。

您可以向我们展示一个代码示例来说明您的意思。在可能之前/之后,最好将它们转换为interface?@RomanC不太可能,因为它是一个复杂的Java枚举,使用枚举的类质量(带有构造函数、方法等),而不仅仅是一个值列表。@Blundell会的,我正在构建一个代码示例。这有什么意义?枚举已经是一个类了。如果您想允许枚举类的其他实例,可以将其方法提取到接口或抽象类中,但仍然使用枚举。我对此表示怀疑(扩展抽象类可能除外).Regular类应该是动态的运行时部分,在需要时进行实例化。让enum实例(根据定义是静态的、固定的和不可变的)成为Regular类的子实例会有什么好处?使enum不是
enum
的主要好处是,它们可以更好地使用generics。谢谢你提供的信息,但这应该放在评论部分,因为它不是问题的答案。对不起,添加了“答案部分”,我认为它已经在那里了,但一定是搞糟了,没有正确完成。