如何在 Eclipse 中将常量重构为枚举?

2023-11-27

如何使用 Eclipse 将 Java 常量重构为枚举?

我发现eclipse中没有内置功能:http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-menu-refactor.htm

我找到了一个插件:http://code.google.com/p/constants-to-enum-eclipse-plugin/。我想知道该插件是否是可行的方法,或者是否有人使用更好的方法。

我总是可以自己创建一个枚举类,并剪切和粘贴常量,这在 2012 年是很乏味的。请不要指给我另一个 IDE,我太老了,不能改变坏习惯;-)


以下是执行此重构的一组自动和手动步骤。

步骤1 将字段封装在常量上

步骤 2 (可选)重命名常量。如果您想重复使用这些名称,请执行此操作。

步骤 3(手动)使用常量的值创建枚举。为枚举提供一个返回常量的 getValue 方法。

步骤 4(手动)将 getter 中的返回值替换为枚举中的 getValue。

步骤 5 内联吸气剂。选择“所有引用”和“删除方法声明”。

步骤 6 内联常量。选择“所有引用”和“删除常量声明”。

如果您愿意,可以在 6 后停止,但是要使用枚举的力量,还有更多工作要做。

步骤 7 对于每个使用 enum.getValue() 作为参数的方法,将传递的常量替换为枚举。

步骤 7a 更改方法签名以添加枚举作为参数。

步骤 7b(手动)将枚举实例作为新参数与 getValue 调用一起传递。确保找到所有实例,否则稍后会出现问题。

步骤 7c(手动)在该方法中,使用新的枚举参数而不是常量。如果您在步骤 7b 中错过了一个呼叫,您的测试将在此处失败。

步骤 7d 更改方法签名以删除旧常量。

步骤 8(手动)对于布尔逻辑中 enum.getValue() 的每次使用,确定是否可以改用 enum。

步骤 9 如果不再使用 getValue 方法,可以将其删除。

步骤 9a(手动)删除未使用的 getValue 方法

步骤 9b(手动)删除构造函数中的字段和赋值。

步骤 9c 更改方法签名以从枚举构造函数中删除该值。

步骤 9d(手动)如果没有其他参数,则删除枚举构造函数。


例如:

public class Initial {
public static final String CONSTANT1 = "value1";
public static final String CONSTANT2 = "value2";

public void method(String aConstant)
{
    if(aConstant.equals(CONSTANT2))
    {
        //do something
    }
}

public void anotherMethod()
{
    method(CONSTANT1);
}

}

Step 1

private static final String CONSTANT1 = "value1";
private static final String CONSTANT2 = "value2";

public void method(String aConstant)
{
    if(aConstant.equals(getConstant2()))
    {
        //do something
    }
}

public void anotherMethod()
{
    method(getConstant1());
}

public static String getConstant1() {
    return CONSTANT1;
}

public static String getConstant2() {
    return CONSTANT2;
}

步骤 2 重命名常量

private static final String _CONSTANT1 = "value1";
private static final String _CONSTANT2 = "value2";
...
public static String getConstant1() {
    return _CONSTANT1;
}

public static String getConstant2() {
    return _CONSTANT2;
}

步骤 3 创建枚举

    public static enum AnEnum {
    CONSTANT1(_CONSTANT1), CONSTANT2(_CONSTANT2);

    private final String value;

    AnEnum(String aValue)
    {
        value = aValue;
    }

    public String getValue()
    {
        return value;
    }
}

步骤 4 替换 Constant getters 中的返回值

    public static String getConstant1() {
    return AnEnum.CONSTANT1.getValue();
}

public static String getConstant2() {
    return AnEnum.CONSTANT2.getValue();
}

步骤 5 内联常量吸气剂

public void method(String aConstant)
{
    if(aConstant.equals(AnEnum.CONSTANT2.getValue()))
    {
        //do something
    }
}

public void anotherMethod()
{
    method(AnEnum.CONSTANT1.getValue());
}

步骤 6 内联常量

    public static enum AnEnum {
    CONSTANT1("value1"), CONSTANT2("value2");

步骤 7a 更改方法签名以添加枚举作为参数。

    public void method(String aConstant, AnEnum theEnum)
    ....
    public void anotherMethod()
{
    method(AnEnum.CONSTANT1.getValue(), null);
}

步骤 7b 将枚举实例作为新参数与 getValue 调用一起传递

    public void anotherMethod()
{
    method(AnEnum.CONSTANT1.getValue(), AnEnum.CONSTANT1);
}

步骤 7c 使用新的枚举参数而不是旧的传递值。

        if(theEnum.getValue().equals(AnEnum.CONSTANT2.getValue()))
    {

步骤 7d 更改方法签名以删除旧常量

public void method(AnEnum theEnum)
....

public void anotherMethod()
{
    method(AnEnum.CONSTANT1);
}

步骤 8 对于布尔逻辑中 enum.getValue() 的每次使用,确定是否可以改用 enum。

        if(theEnum.equals(AnEnum.CONSTANT2))
    {
        //do something
    }

步骤 9a 删除未使用的 getValue 方法 步骤 9b(手动)删除构造函数中的字段和赋值。 步骤 9c 更改方法签名以从枚举构造函数中删除该值。 步骤 9d(手动)如果没有其他参数,则删除枚举构造函数。

    public static enum AnEnum {
    CONSTANT1, CONSTANT2;
}

所以最终代码如下所示:

public class Step9d {

public static enum AnEnum {
    CONSTANT1, CONSTANT2;
}

public void method(AnEnum theEnum)
{
    if(theEnum.equals(AnEnum.CONSTANT2))
    {
        //do something
    }
}

public void anotherMethod()
{
    method(AnEnum.CONSTANT1);
}

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

如何在 Eclipse 中将常量重构为枚举? 的相关文章

随机推荐

  • Android:如何检测assets文件夹中的目录?

    我正在检索这样的文件 String files assetFiles list EngagiaDroid 我们如何知道它是一个文件还是一个目录呢 我想循环访问资产文件夹中的目录 然后复制其所有内容 我认为更通用的解决方案 如果您有子文件夹等
  • 使用 spring-boot-admin-server 时创建名为“conversionServicePostProcessor”的 bean 时出错

    我试图为我的应用程序启用 Spring boot 管理服务器 默认设置工作得很好 但是当我尝试启用安全性时 出现以下错误 应用程序无法启动 描述 bean conversionServicePostProcessor 在类路径中定义 资源
  • 如何否定进程的返回值?

    我正在寻找一个简单但跨平台的negate 否定进程返回值的进程 它应该将 0 映射到某个值 0 并将任何值 0 映射到 0 即以下命令应返回 yes nonexistingpath 不存在 ls nonexistingpath negate
  • Python:通过变量名引用对象属性? [复制]

    这个问题在这里已经有答案了 我正在用 Python 编写棋盘游戏 大富翁 大富翁 拥有三种类型的土地供玩家购买 房产 如木板路 铁路和公用事业 房产有 6 种条件 0 4 栋房屋或酒店 的可变购买价格和租金 铁路和公用事业有固定的价格和租金
  • Alamofire 接受和内容类型 JSON

    我正在尝试在 Swift 中使用 Alamofire 发出 GET 请求 我需要设置以下标题 Content Type application json Accept application json 我可以绕过它并直接指定请求的标头 但我
  • 将数组打印到文件

    我想将数组打印到文件中 我希望该文件看起来与这样的代码完全相同 print r abc 假设 abc 是一个数组 是否有任何单行解决方案可以解决此问题 而不是每种外观都常规解决方案 P S 我目前使用序列化 但我想让文件可读 因为序列化数组
  • Object.defineProperty 获取/设置闭包

    好的 我尝试这样创建新对象 var src a a b b c c var out for var prop in src Object defineProperty out prop get function return src pro
  • 尽管网站是 HTTPS,但 WebView 显示 ERR_CLEARTEXT_NOT_PERMITTED [重复]

    这个问题在这里已经有答案了 我开始在 Android 上开发一个应用程序 所以我没有太多东西 到目前为止我所拥有的只是一个 WebView 我在 Android Studio 中创建了该项目 并将我的项目设置为 Android Instan
  • 在 php 服务器端使用meteor.js

    我开发了一个应用程序 我想使用meteor js进行实时更新 我想增强但不改变我的程序 例如当用户添加评论时使其实时更新 问题是meteor js使用node js 因此javascript作为服务器端代码 我使用 LAMP 堆栈 是否可以
  • 阻止执行上传的php文件?

    在我的项目中 允许用户上传任何类型的文件 我需要确保安全 防止执行可由 php 解析的上传文件 php html 等 有没有办法告诉apache不要在web uploads中解析任何带有php的文件并简单地将它们显示为纯文本 还有什么其他选
  • Visual Studio 2013 编辑并继续不起作用

    使用 VS2013 Pro 我在调试 MFC 程序时无法使用 编辑并继续 我新建了一个MFC项目来测试 操作系统是 Windows 7 64 位 我正在运行 Visual Studio 2013 12 0 30110 00 Update1
  • 获取当前的 jupyter-lab 笔记本名称 [适用于 Jupyter-lab 版本 2.1 和 3.0.1 以及笔记本版本 >6.0.3)

    Problem Hi all 正如我的标题所示 我想访问笔记本名称 在Jupyter实验室 作为变量 所以我可以在笔记本本身中重用它 例如 命名笔记本中生成的一些图形文件 我看到几年前就有人提出过类似的问题 看这里 然而我没有找到满意的答案
  • Rails 如何决定使用 PUT 或 POST 方法渲染表单?

    Rails 生成一个表单部分 可以在由 get 操作呈现的页面和由新操作呈现的页面上使用 如果是前者 则表单的方法设置为 PUT 如果是后者 则表单的操作设置为 POST Rails 如何决定使用哪种方法 如果传递给表单的对象是persis
  • Symfony2 - 创建自己的供应商包 - 项目和 git 策略

    我们正在考虑创建自己的common用于实体映射和服务的捆绑包 可在几个单独的应用程序中使用 捆绑包应该易于修改 运行 包含和测试 我知道关于构建捆绑包的最佳实践 但我不知道什么git开发时使用的策略 我们是否应该创建common捆绑为整个项
  • android MediaRecorder setVideoSize() 的问题

    安卓可以吗MediaRecorder捕获分辨率高于的视频320 240 当我使用MediaRecorder setVideoSize 设置视频大小 捕获的视频分辨率均为320 240 更糟糕的是 较高的无法获得清晰的视频 它们莫名其妙地呈绿
  • 如何处理调用 API 的 Next.js 中动态路由的未找到 404? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我有一个由 React 和 Next js 在客户端开发的网站 并从 Asp Net core 服务器调用 API 来获取动态数据 例如产品和类别 问题是当我请求的 URL 中有未定义的参
  • 无法让我的 DatePickerDialog 以编程方式使用微调器样式

    我正在使用一个DialogFragment开一个DatePickerDialog public class DatePickerFragment extends DialogFragment Override public Dialog o
  • 使用 bootstrap 和 jquery 更改弹出窗口的标题

    这是链接的 html 即 a href style font size 6 color 222 class popover test laquo a 是的 我正在调用 popover 进行初始化 并且弹出窗口工作得很好 我可以毫无问题地更新
  • 从文件中读取随机行的简单方法是什么?

    在 shell 脚本中从文件中读取随机行的简单方法是什么 您可以使用shuf shuf n 1 FILE 还有一个实用程序称为rl 在 Debian 中它位于randomize lines软件包完全可以满足您的需求 但并非在所有发行版中都可
  • 如何在 Eclipse 中将常量重构为枚举?

    如何使用 Eclipse 将 Java 常量重构为枚举 我发现eclipse中没有内置功能 http help eclipse org juno index jsp topic 2Forg eclipse jdt doc user 2Fre