Java 将私有字段转换为常量
我从其他开发人员那里得到了一个设计糟糕的类,如下所示:Java 将私有字段转换为常量,java,android-studio,intellij-idea,Java,Android Studio,Intellij Idea,我从其他开发人员那里得到了一个设计糟糕的类,如下所示: 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 } 我需
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
}
我需要这些字段是,私有静态最终字段代码>。如何以自动化的方式实现同样的目标
我试过了
- 提取常数
- 更改签名
但什么都不管用
注意:我使用的是Intellij Idea/Android Studio IDE如果我做对了(包括来自评论的内容),您希望将所有私有字符串假定为常量替换为私有静态最终字符串假定为常量。我不知道intellijidea
是否有这种能力,但是你可以使用记事本(我使用notepad++
)并用正则表达式替换它们
查找应该更改的字段的正则表达式是:私有字符串([A-Z]\w+)
(注意A-Z部分。它只捕获假定的以大写开头的静态final
字段)
然后将其替换为private static final String\1
Notepad++
(Ctrl+H
菜单)中的结果来自:
致:
最有可能的情况是,您将替换不想替换的变量,但您始终可以调整正则表达式以适应您的情况。以下是一个根据@kris的建议得到的解决方案:
我将所有需要重构的字段复制到另一个只有这些字段的虚拟类中
我对所有这些字段进行了查找->替换,从private String
到private static final String
我在IntelliJ中使用了以下模式/替换字符串,它假设变量正确地命名为常量,即全部大写
搜索字符串
private (String [A-Z_0-9$]* = .*;)
替换字符串
private static final $1
但是什么都不管用你是什么意思?设置私有静态最终字符串应该是常量吗代码>不工作,或者什么?@GauravMall:Edited——想以自动方式完成这项工作意味着您想通过使用IDE中的选项或编程方式自动生成这些字段?@GauravMall private static final String假定为\u常量\u 1;不会工作,因为它将生成编译错误:-)是的,我做了类似的操作。为什么使用“\w”?常量名称不应包含小写字符。但是\w
基本上是[a-zA-Z0-9.]
@AxelH,我想是为了让它不那么严格。但是是的。。[A-Z0-9]听起来好多了。很高兴知道你成功了!:-)。对于这种情况,发布的答案更为通用。也许最好接受其中一个!请接受其中一个这样的答案,以表彰他们的贡献。写你自己的答案的形式很糟糕,基本上是一样的。正则表达式错了吗?我的意思是,变量可以以数字开头吗?当然可以更改,但这是一个很小的细节,如果它以数字开头,无论如何都会有语法错误,我想我们可以假设代码以数字开头是正确的。@GeorgeZ。它不应该重新创建编译器的逻辑。。。我有一个更重要的意见是\u 1
应该是成员还是常量?$
也是一个有效的字符哦,这取决于OP来回答这个问题,但是\u 1
是变量的有效名称。但由于没有字母(因此没有大写/小写),无法确定这是否是一个常数。我同意,只是指出了这种逻辑的局限性。公平地说,我会从源头上处理这个问题,并通过手动替换每个变量来教那些造成混乱的开发人员。。。
private (String [A-Z_0-9$]* = .*;)
private static final $1