【问题标题】:Why Observable is still a class in Java 8?为什么 Observable 在 Java 8 中仍然是一个类?
【发布时间】:2015-01-05 17:46:01
【问题描述】:

相关问题:

Why is java.util.Observable not an abstract class?

既然我们有可以包含默认方法的接口,那么将 Observable 更改为接口不是更好的主意吗?从功能的角度来看,Observable “做一件事”而不是“是一件事”。应该改成Java 8中的接口对吧?

【问题讨论】:

  • 虽然这不是一个答案,虽然 Java 9 还不是最终版本;但在 Java 9 中,java.util.Observer 和 java.util.Observable 都已弃用。

标签: java java-8


【解决方案1】:

应该改成Java 8中的接口对吗?

除非您想破坏所有向后兼容性,否则不会。如果你把它改成一个接口,那么任何东西都写成:

public class Foo extends Observable

会坏掉的。我怀疑它在二进制兼容性方面也可能是无效的,但只是源不兼容就足以使它成为一个不可行的更改,IMO。

同样:

  • 它当前是一个具体类,而不是抽象类...所以new Observable() 当前有效但不会作为接口
  • 正如您在另一个答案中所说的那样,默认实现使用状态...所以它不能通过接口默认方法实现

【讨论】:

  • 更重要的是,如果Observable 变成interfacenew Observable() 之类的代码也会中断。是的,它也破坏了二进制兼容性,类和接口之间的区别也发生在字节码中。
  • @Holger:啊 - 我没有意识到它已经是一个具体的类。我以为是抽象的。会添加这个。
  • 我也没有意识到这一点,由于protected 方法,它几乎没有用,但在链接的问题中讨论了这一点,所以我了解到原则上这是可能的,你永远不知道编码员做什么。所以很明显,如果没有正当的好处,Oracle 不会破坏兼容性,即使使用晦涩难懂的代码。
【解决方案2】:

它将破坏向后兼容性,并且所有扩展 Observable 的类都将被破坏。

【讨论】:

    【解决方案3】:

    我没有看太多,所以没有意识到

    即使在 Java 8 中,interfaces 也不能是 state-ful

    Observable 需要将 change flagObservers 数组存储在内部,因此是有状态的,而 Java 8 不支持它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 2014-12-19
      • 2020-09-14
      • 1970-01-01
      • 2018-10-14
      • 2021-12-20
      • 2023-04-03
      • 2011-09-23
      相关资源
      最近更新 更多