【问题标题】:Convert private fields to constants [closed]将私有字段转换为常量[关闭]
【发布时间】:2019-12-30 10:26:02
【问题描述】:

我有一个来自其他开发人员的糟糕设计的课程如下:

public class Clz {
    private String SUPPOSED_TO_BE_CONSTANT_1 = "value 1";
    private String SUPPOSED_TO_BE_CONSTANT_2 = "value 2";
    private String SUPPOSED_TO_BE_CONSTANT_3 = "value 3";
    //... And many more
}

我需要这些字段,private static final FIELD;。如何以自动化的方式实现相同的目标?

我试过了,

  • 提取常数
  • 更改签名

但没有任何效果。

注意:我使用的是 Intellij Idea/Android Studio IDE

【问题讨论】:

  • 但没有任何效果。 - 你是什么意思?
  • 设置private static final String SUPPOSED_TO_BE_CONSTANT_1; 不起作用,还是什么?
  • @GauravMall :已编辑——希望以自动化方式进行
  • 意思是您想通过使用 IDE 中的选项或以编程方式自动生成这些字段?
  • @GauravMall 私有静态最终字符串 SUPPOSED_TO_BE_CONSTANT_1;不会工作,因为它会产生编译错误:-)

标签: java android-studio intellij-idea


【解决方案1】:

如果我做对了(包括来自 cmets 的内容),您希望将所有 private String SUPPOSED_TO_BE_CONSTANT 替换为 private static final String SUPPOSED_TO_BE_CONSTANT。我不知道Intellij-IDEA 是否能够做到这一点,但您始终可以为此使用记事本(我使用Notepad++)并用正则表达式替换它们。

查找应该更改的字段的正则表达式是:private String ([A-Z]\w+)(注意 A-Z 部分。它只捕获假定的以大写开头的 static final 字段)。

然后将其替换为private static final String \1

Notepad++Ctrl+H 菜单)中的结果来自:

private String SUPPOSED_TO_BE_CONSTANT_1 = "value 1";
private String SUPPOSED_TO_BE_CONSTANT_2 = "value 2";
private String SUPPOSED_TO_BE_CONSTANT_3 = "value 3";

到:

private static final String SUPPOSED_TO_BE_CONSTANT_1 = "value 1";
private static final String SUPPOSED_TO_BE_CONSTANT_2 = "value 2";
private static final String SUPPOSED_TO_BE_CONSTANT_3 = "value 3";

您很可能会替换不想替换的变量,但您可以随时调整正则表达式以适合您的情况。

【讨论】:

  • 是的,我做了类似的事情
  • 你为什么使用`\w`?常量名称不应包含小写字符。但是\w基本就是[a-zA-Z0-9_]
  • @AxelH 我想让它不那么严格。但是是的.. [A-Z0-9] 听起来更好。
【解决方案2】:

我在 IntelliJ 中使用了以下模式/替换字符串,它假定变量被正确命名为常量,即全部大写。

搜索字符串

private (String [A-Z_0-9$]* = .*;)

替换字符串

private static final $1

【讨论】:

  • 正则表达式是不是错了?我的意思是,变量可以以数字开头吗?
  • 当然可以更改,但这是一个很小的细节,如果它以数字开头,无论如何都会出现语法错误,我认为我们可以假设代码开头是正确的。
  • @GeorgeZ。它不应该重新创建编译器的逻辑...我有一个更重要的评论是_1 应该是成员还是常量?而$ 也是有效字符
  • 嗯,这取决于 OP 来回答这个问题,但 _1 是变量的有效名称。但是由于没有字母(所以没有大写/小写),因此无法确定这是否应该是一个常数。
  • 我同意,只是指出这种逻辑的极限。公平地说,我会从源头上处理问题,并通过手动替换每个变量来教造成混乱的开发人员......
【解决方案3】:

这是一个根据@kris 的建议工作的解决方案:

  1. 我将重构所需的所有字段复制到另一个只有这些字段的虚拟类中
  2. 我对从private Stringprivate static final String 的所有这些字段进行了查找->替换

【讨论】:

  • 很高兴知道你成功了! :-) 。对于这种情况,发布的答案更为通用。可能最好接受其中之一!
  • 请接受说明这一点的其他答案之一,以表彰他们的贡献。编写您自己的答案基本上是相同的,这是一种糟糕的形式。
猜你喜欢
  • 1970-01-01
  • 2018-10-03
  • 2019-11-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多