Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将私有字段转换为常量_Java_Android Studio_Intellij Idea - Fatal编程技术网

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