2009-09-02 87 views
8

重构方法时,很容易在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{ 
    // binary compatibility wrapper 
    public void x(){ super.x(); } 
} 

回答

12

自动工作“扩大”影响了方法的签名,这样是不是二进制兼容的。将方法移到超类不会影响方法签名,因此它可以工作。 Eclipse有描述API和ABI的兼容性有很大的文档:

http://wiki.eclipse.org/Evolving_Java-based_APIs

更明确的规则是在第2部分:

http://wiki.eclipse.org/Evolving_Java-based_APIs_2

我相信你感兴趣的“更改类型的形式参数“(即,你所说的扩展)或”将API方法向上移动到类型层次结构“(即你所说的拉入父类)。

-1

应该继续为Java提供了动态链接

+0

我想到了关于扩展方法的同样的事情...这是行不通的,因为参数的类名成为内部方法名的一部分。我想知道是否同样适用于编译器认为声明该方法的类的名称。 – Thilo 2009-09-02 01:47:56

+1

“加宽”会影响该方法的签名,但将该方法移至超类不会。在命令行上试用它。 – 2009-09-02 03:00:06

+0

@bkail:让这个答案,以便我可以投票。 – Thilo 2009-09-02 04:49:39