首页 文章

在现有代码中为常量创建静态导入的简单方法?

提问于
浏览
37

如果我在Foo中有一个恒定的BAR,我将在C类中使用它,我将不得不写

Object o = Foo.BAR + "...";

我可以在Eclipse中使用Ctrl-Shift-M(光标在BAR上)来创建静态导入,如下所示:

import static Foo.BAR;

Object o = BAR + "....";

我目前正在更新遗留代码,其中有数以千计的这些代码我想转换为静态导入 . Ctrl-Shift-O / Organize导入不会这样做 . 有没有我错过的技巧?


编辑:实际上,我更喜欢的是告诉Eclipse我想让Ctrl-Shift-M在这个特定类中的所有实例上做它的魔力,而不仅仅是我放置光标的单个实例 . (这是遗留代码所以这实际上提高了可读性:))


编辑:我发现IntelliJ建议这样做 .

9 回答

  • -3

    一个注意事项:过度使用静态导入实际上可能会使代码的可读性降低(imho),特别是如果常量名称没有明确指出它所属的类或枚举 . 您还可以从听起来相似甚至具有相同名称的不同类/枚举中获取常量名称 .

    所以你强迫读者做的是希望他的IDE会告诉他课程(通过工具提示),或者他们必须导航到它以找出它是什么 . 打印输出和代码片段变得更少可重复 .

    老实说,出于这些原因,我极少使用静态导入 .

  • -1

    我不知道任何其他自动重构来做你正在寻找的东西,但这有两个关键方面 - 一个是添加导入,另一个是从常量中删除类名 .

    为了添加导入,我建议在每个使用它们的文件上粘贴 import static application.KeyHolder.*; .

    要删除类名,请在eclipse中执行Java搜索 KeyHolder.* 并搜索字段 . 然后,您可以为"KeyHolder."执行查找/替换,并替换为“” . 为了防止不匹配,请确保替换的项目数等于该文件的匹配数 . 此外,请确保搜索并在导入后开始 .

  • 0

    发明正则表达式来解决这些问题! =)

    您需要编写一个小脚本(或使用IDE正则表达式搜索/替换) . 唯一的问题是,如果有很多类需要静态导入,那么它的工作量也一样多 . 否则,如果它只有一个类像FOO.BLAH,那么你可以使用正则表达式

    (\bFOO\.(\w+)\b) - >替换为第2组($ 2或\ 2或者你的正则表达式搜索者确实捕获替换) .

    你可以在这里试试:http://www.gskinner.com/RegExr/ . 选择替换选项卡并输入$ 2

    如果你有这样的表达式可能会出现问题: FOO f = FOO.blah + "FOO.blah" ,所以要注意这一点 .

    至于文件顶部的import语句,eclipse有一个自动导入功能,它在格式上自动导入,只要导入的名称足够独特,它就可以工作 . 或者,如果您因为名称太常见而无法使用它,则可以使用perl脚本来代替正则表达式,并预先添加静态导入 .

  • 3

    听起来不错,但是在你改变了所有文件之后,它们会有多好?也许您应该考虑仅因为其他原因而更改您正在处理的文件 .

  • 2

    如果我遇到这样的挑战,我可能会写一个小程序来为我做 . Ruby和Python(JRuby和Jython?)非常适合这项任务,尽管你也可以用Java来完成 .

    好的,所以这可能至少会花费你手动操作的时间,但至少你会玩得开心:) .

  • 11

    Eclipse可以进行全局搜索,并使用正则表达式替换项目中的所有文件 .

    要在所有文件的开头添加静态导入,您可以自行替换包声明以及静态导入 .

    然后做一个项目范围的组织导入,你就完成了 .

    但要小心,如果你做错了,这也可能会造成很大的混乱 .

  • -2

    那些作为解决方案出现的东西 . 我建议使用一个简单的groovy脚本 . 基本上,语义与解析import语句及它们引用的文件有关 . 一些基本步骤可能是这样的

    • 递归目录中的每个文件 . 检查文件扩展名是否为.java

    • 匹配以import开头的任何行

    • 对于每个这样的行打开相关的源文件(您已经知道import语句的路径) .

    • 匹配字段/方法使用反射声明静态修改器

    • 在步骤5中找到的匹配项的import语句后添加static .

    如果我有时间,我会尝试发布一个小的groovy脚本来做同样的事情 .

  • 0

    确保与其他常量类没有冲突

    将所有"Foo."替换为空(" ")

    在顶部使用此行 . 为我工作

    import static Foo . *

  • 1

    我不知道它是否符合您的需求,但您可以始终在界面中定义这些常量,并让所有类只实现此接口 . 然后使用一些智能的RegExp,如其他人建议你可以摆脱所有 Foo. 出现 .

    例:

    public interface Foo {
       static final String constant1 = "Some";
       static final String constant2 = "Value";
       //...
    }
    

    然后

    public class YourClass implements Foo {
       public YourClass() {
          System.out.println("Hello " + constant1);
       }
    }
    

相关问题