Tag: 重构

在处理重构’重命名包’时已捕获exception

这个重构函数在Eclipse中用于包名称,对我来说很好,直到…今天: 这是我第一次收到这个奇怪的重构错误,我不知道该怎么做: 处理重构’重命名包’时遇到exception。 原因:移动资源时遇到问题。 单击“撤消”以撤消当前重构的所有成功执行的更改。 单击“中止”以中止当前的重构。 什么可以解释这突如其来的“心灵改变”,我该如何解决?

Java中的重构方法和二进制兼容性

在重构方法时,很容易在Java中引入二进制不可编码(使用以前版本的代码)。 考虑更改方法以将其参数的类型扩展为父接口: void doSomething(String x); // change it to void doSomething(CharSequence c); 使用此方法的所有代码将继续编译而不进行更改,但它确实需要重新编译(因为旧的二进制文件将因MethodNotFoundError而失败)。 如何将方法拉入父类。 这需要重新编译吗? // before public class B extends A{ protected void x(){}; } // after public class A { public void x(){}; } public class B extends A{} 该方法已从B移至父A。它还将可见性从受保护更改为公共(但这不是问题)。 我是否需要在B中维护“二进制兼容性包装器”,还是继续工作(自动分派到父类)? // do I need this ? public class B extends A{ // […]

Java – 包含数组字段的枚举

我想将每个名称的列表名称和单个昵称存储为Java中的Enum。 昵称的数量不会有所不同。 目的是能够从昵称中获取全名。 目前我已经实现了这样: public enum Names { ELIZABETH(new String[] {“Liz”,”Bet”}), … ; private String[] nicknames; private Names(String[] nicknames) { this.nicknames = nicknames } public Names getNameFromNickname(String nickname) { //Obvious how this works } } 我不喜欢不得不重复new String[] {…} ,所以我想知道是否有人可以建议一种替代的,更简洁的实现方法? 干杯, 皮特

重构使用相同代码但不同类型的方法

我有几种方法可以做同样的事情,当与MySQL数据库连接时,保存或加载不同类型的参数。 目前,我对每种类型都有不同的方法。 如何组合这些方法以便它们支持不同类型? 下面是两个非常相似但使用不同类型的方法的示例: public static void saveLongArray(Connection con, int playerID, String tableName, String fieldName, long[] array, long[] originalArray) { try { for (int i = 0; i < array.length; i++) { // Check for change before running query if (array[i] != originalArray[i]) { if (array[i] != 0 && array[i] != -1) { PreparedStatement updateQuery […]

重构静态方法/静态字段以进行测试

我有以下遗留代码: public class MyLegacyClass { private static final String jndiName = “java:comp/env/jdbc/LegacyDataSource” public static SomeLegacyClass doSomeLegacyStuff(SomeOtherLegacyClass legacyObj) { // do stuff using jndiName } } 这个类在J2EE-Container中工作。 现在我想测试容器外面的类。 什么是最好的策略? 基本上允许重构。 允许访问LegacyDataSource(测试不必是“纯”unit testing)。 编辑:不允许引入其他运行时框架。

用Java重构代码,替换大型if语句

我正在重构我正在研究的项目中的一些代码,并且我遇到了一个跟随格式的大型if / else if语句: if (changer instanceof AppleChanger) { panel = new ApplePanel(); } else if (changer instanceof OrangeChanger) { panel = new OrangePanel(); } 现在我的第一个冲动是使用多态来重构它,使它看起来像 panel = changer.getChangerPanel(); 但遗憾的是,类包无法访问面板包。 我的下一个冲动是使用重载方法创建一个PanelChooser类: PanelChooser.getPanel(changer); //Overloaded Method public Panel getPanel(OrangeChanger changer) { Panel orangePanel = new OrangePanel(); return orangePanel; } public Panel getPanel(AppleChanger changer) { Panel applePanel = […]

Java反思和重构的痛苦

Java Reflection提供了一种在运行时对Object进行内省的机制。 没有第二个想法,这是一个很棒的function,但它打破了所有重构惯例! 即使在现代IDE中也没有简单的方法( File Search除外)知道引用了哪个属性以及在哪里。 这使得Refactorings变得更加复杂(令人厌烦!)并且容易出错。 坦率地说,它不仅仅是Reflection API ; Hibernate mapping files (hbm.xml)和JSP files都将属性称为String,当您重构属性名称时,您必须手动更改所有这些位置。 更糟糕的是,Hibernate映射文件或JSP文件中的更改会导致运行时错误。 我很想知道其他程序员如何在Java中处理这个问题。 有一些工具吗? 我使用Eclipse / IBM RAD作为主要开发平台。 通常我们使用constant来定义属性并尽可能地使用它,但它并不总是可行的。 我也有兴趣其他语言如何处理这个!

清理大型遗留Java项目

我被指派在一个巨大的Java项目上做一些工作,并且几个迭代开发人员的影响是显而易见的。 没有标准的编码风格,格式,命名约定或类结构。 这是我和Javadoc一起上课的好日子,unit testing是一个快乐的白日梦。 到目前为止,我们这个项目的人已经“融入”,适应我们正在进行的任何类别的现有惯例,但现在是时候强加一些秩序和一致性。 这是一项艰巨的挑战,我正在寻找人们对这项任务可能提出的任何建议。 是否有任何特别有效的策略或需要注意的陷阱? 尝试是一个好主意吗? 编辑添加:我不想给人一种项目不好的印象 – 它实际上是设计稳固,而且写得很好。 它只是感受它的年龄和维护的必然性……

是否有任何工具可以重构java代码库的编码风格?

通常,在对现有项目进行一些工作时,我会选择代码库中已经建立的任何样式。 但我们的团队必须维护多个中小型项目,这些项目在编码风格上略有不同。 如果我们能够清理这些差异,那将更有效,更少混乱。 所以我正在寻找一种允许我重构现有风格的工具。 标准代码格式化工具已经提供了许多function,例如更改缩进样式。 我缺少的是一个允许我去除字段和参数名称前缀的工具。 在某些项目中,所有成员都以“m”为前缀,所有参数都以“p”为前缀,静态成员以“s”为前缀。 该工具应该能够处理如下情况: void setValue(String pValue) { mValue = pValue; } 哪个应该成为: void setValue(String value) { this.value = value; } 该工具应在以下情况下生成警告: void setValue(String pValue) { int value = 42 } 我知道每个主要IDE都提供重构:重命名function。 我正在寻找的是一个处理整个代码库的工具,而不需要单独遍历每个参数/字段。 编辑 很多答案提到了重新格式化源代码或根据一组样式规则检查代码库的工具。 我知道这些工具存在。 我特别想要的是一个高级工具,它允许我删除范围特定的变量名前缀。

有没有办法为其副作用应用重构脚本?

我有一个库被更改为引入工厂方法来替换构造函数(原因现在并不重要,在目前的情况下,它主要用于改进类型推断)。 假设有一个Eclipse重构脚本(所以我几乎有一个很好的计算机可读描述的变化),有没有办法将该脚本应用于只使用该库的项目(即它只有一个参考到库的编译版本)? 例如,我从这个简单的类开始: public class MyContainer { private final T content; public MyContainer(final T content) { this.content = content; } public T getContent() { return content; } } 现在我介绍一个工厂(没有将构造函数设为私有,但现在并不是真正相关),工厂方法如下所示: public static MyContainer holding(T content) { return new MyContainer(content); } 当我现在导出迁移脚本时,它看起来像这样: 这应该包含足够的信息以将重构应用于另一个通过jar文件引用类( 当前版本)的项目。 但是尝试应用重构会给我这个错误: 无法执行refatoring’Introduce Factory’(org.eclipse.jdt.ui.introduce.factory),因为它的输入’scratch.MyContainer.java’不存在。 请注意,它明确提到.java ,因此它正在寻找源文件,并不满足于将重构应用于二进制类型。 注意:我不想修补二进制库。 我只想将原始构造函数的调用者转换为调用工厂方法。 注意2:在我的具体情况下,搜索和替换将无济于事。 原因是我有两个构造函数,一个使用Object ,另一个使用String 。 它们应该映射到两个不同的工厂方法,所以我需要搜索和替换函数来查看参数的类型信息。 注3:即使是一种手动指定“用此构造函数替换对象X实例化而不是调用此方法”的方法也将受到赞赏。 […]