在现有代码中为常量创build静态导入的简单方法?
如果我在Foo中有一个常量BAR,我将在C类中使用它,所以我必须写
Object o = Foo.BAR + "...";
我可以在Eclipse中使用Ctrl-Shift-M(使用BAR上的光标)创build一个像下面这样的静态导入:
import static Foo.BAR; Object o = BAR + "....";
我目前正在更新遗留代码与文学成千上万的这些我想转换为静态导入。 Ctrl-Shift-O /组织导入不会这样做。 有没有我错过的一个技巧?
编辑:其实,我更喜欢的是一种方法来告诉Eclipse,我希望有Ctrl-Shift-M在这个特定的类中的所有实例上做它的魔术,而不是我有光标放置在单个实例。 (这是遗传代码,所以这实际上提高了可读性:))
编辑:我发现,IntelliJbuild议这样做。
需要注意的一点是:过度使用静态导入实际上可能会使代码不易读(imho),特别是如果常量名称没有明确指出它所属的类或枚举。 你也可以从不同的类/枚举中得到类似或甚至具有相同名称的常量名称。
所以你迫使读者做的是希望他的IDE会告诉他(通过工具提示)他们的课程,或者他们必须导航到它,以找出它是什么。 打印输出和代码片段变得不那么可再次使用。
老实说,我使用静态导入极less出于这些原因。
我不知道任何其他的自动化重构来做你正在寻找的东西,但是有两个关键的方面做到这一点 – 一个是添加导入,另一个是从常量中删除类名。
为了添加导入,我build议粘贴import static application.KeyHolder.*;
在每个使用它们的文件上的包之后。
为了除去类名,在eclipse中执行KeyHolder.*
的Javasearch并search一个字段。 然后,您可以查找/replace“KeyHolder”。 并用“”replace。 为了防止不匹配,请确保replace的项目数量等于该文件的匹配数量。 另外,请确保您search下来并开始后导入。
发明了正则expression式来解决这样的问题! =)
您将需要编写一个小脚本(或使用IDE正则expression式search/replace)。 唯一的问题是,如果有很多类需要静态导入,那么它的工作就是一样的。 否则,如果它只有一个类FOO.BLAH,那么你可以使用正则expression式
(\bFOO\.(\w+)\b)
– >用组2replace($ 2或\ 2,但是您的正则expression式search器不会捕获replace)。
你可以在这里试试: http : //www.gskinner.com/RegExr/ 。 selectreplace选项卡并input$ 2
如果你有像这样的expression式,可能会出现一个问题: FOO f = FOO.blah + "FOO.blah"
,所以要小心。
至于文件顶部的导入语句,eclipse有一个自动导入function,可以自动导入格式,只要导入的名字足够独特,它就可以工作。 或者,如果您不能使用它,因为名称太常见了,您可以使用perl脚本来执行正则expression式,并且使用静态导入。
听起来像一个好主意,但是当你改变了所有的文件之后,它们会变得多好? 也许你应该考虑只改变你正在为其他原因正在工作的文件。
如果我面对这样的挑战,我可能会写一个小程序来为我做。 Ruby和Python(JRuby和Jython?)非常适合这个任务,尽pipe你也可以用Java来完成。
好的,所以这可能会带你至less和手工一样的时间,但至less你会很开心:)。
Eclipse可以执行全局search,并使用正则expression式replace项目中的所有文件。
要在所有文件的开始处添加静态导入,您可以自行replace包声明加上静态导入。
然后做一个项目广泛的组织import,你都设置。
但是,要小心,如果你做错了,这也会造成很大的麻烦。
那么popup一个解决scheme。 我会build议使用一个简单的groovy脚本。 基本上,语义与parsing导入语句及其引用的文件有关。 一些基本的步骤可能是这样的
- recursion目录内的每个文件。检查文件扩展名是.java
- 匹配任何以导入开头的行
- 对于每一行,打开相关的源文件(您已经知道导入语句的path)。
- 使用reflection匹配静态修改器的字段/方法声明
- 在步骤5中find的匹配的导入语句之后添加静态。
如果我得到一些时间,我会尝试发布一个小Groovy脚本做同样的。
确保没有与其他常量类冲突
取代所有的“Foo”。 空(“”)
在顶部使用这条线。 为我工作
导入静态Foo。*
我不知道它是否适合您的需求,但是您可以随时在接口中定义这些常量,并让所有类都实现此接口。 然后像别人一样使用一些聪明的RegExpbuild议你可以摆脱所有的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); } }