【问题标题】:Does removing the "final" keyword affect binary compatibility?删除“final”关键字会影响二进制兼容性吗?
【发布时间】:2012-06-10 14:43:38
【问题描述】:

如果我从方法或其他“事物”中删除 final 关键字,我的类的用户是否必须重新编译?

【问题讨论】:

  • @OliCharlesworth 我想删除它,而不是添加它。

标签: java binary-compatibility


【解决方案1】:

不,假设你对这个疣没问题,删除 final 关键字不会破坏兼容性:

如果模块 B 调用模块 A 中某个类的任何方法,并且模块 C 覆盖了先前的最终方法,并且模块 C 中的对象被传递给模块 B,则调用将转到模块 A 的实现。

【讨论】:

  • 请注意,不应该依赖这个特殊的疣来工作,因为任何依赖它的代码都依赖于编译器优化才能运行。
【解决方案2】:

从技术上讲,它们不必重新编译。

我想不出从方法/属性中删除 final 关键字会产生任何影响,这可能会导致兼容性损失,因此它不会给您带来任何问题。

用示例代码测试,没有运行时错误:

public class Test2{
    public static final String test = "HELLO!";
}

public class Test {
    public static void main (String [] args) {
        System.out.println(Test2.test);
    }
}
  1. 编译的Test.java
  2. 运行 Test.java -> 输出 = "HELLO!"
  3. 修改Test2.java:

    public class Test2{
        public static String test = "HELLO!";
    }
    
  4. 编译的Test2.java

  5. 运行 Test.java -> 输出 = "HELLO!"

【讨论】:

    【解决方案3】:

    如果您的客户直接调用您的代码,则不会。 但是它可能会破坏一个使用反射发现你的类的程序,检查你的方法是否是最终的,如果方法是最终的,它会做不同的事情。

    【讨论】:

      【解决方案4】:

      直接从马嘴里:

      将声明为 final 的方法更改为不再声明为 final 不会破坏与预先存在的二进制文件的兼容性。

      http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.17

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-09
        • 2016-04-01
        • 2013-03-08
        • 2013-11-15
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        相关资源
        最近更新 更多