7

我想只弃用给定类的扩展,而不是使用@Deprecated 注解包含在一个类中的所有方法和字段。

也就是说,如果您扩展给定的类,则会出现警告 - 但对方法或字段的引用不会触发警告。已经有几个类扩展了这个类,我想让弃用警告针对这些客户端——我还不能破坏它们(但它们可以重新编译——不需要 ABI 兼容性)。

Java 1.6(JDT 编译器)有可能吗?

4

5 回答 5

5

两个考虑

1) 该类可能已经扩展,因此不要将其标记为 final,否则可能会破坏向后兼容性。

2)你不希望类扩展,所以它应该被标记为final。

我认为您应该做的是用新类扩展旧类,将旧类标记为已弃用,并将新类声明为最终类。在新类中,您可以添加 @SuppressWarning 标记来消除不推荐使用的消息,然后您应该会得到一个干净的编译。

使用旧类的代码将收到@Deprecated 警告,但仍会编译。使用新类的代码将编译干净。对您的用户来说是一种“强烈建议”,而不是向后兼容的中断,并且由于 API 100% 兼容,因此他们很容易修复。

于 2011-02-14T19:38:15.790 回答
4

我怀疑这是否可以使用@Deprecated注释。

但是,如果您可以控制源,则可以执行以下操作:

  1. 将当前类重命名SomeClassSomeClassSuper
  2. 创建一个名为的新类SomeClass并让它扩展SomeClassSuper
  3. Make SomeClassfinal (防止客户扩展它)。

也就是说,从

class SomeClass {
    // ...
}

class SubClass extends SomeClass {
    // ...
}

class SomeClassSuper {
    // ...
}

class SubClass extends SomeClassSuper {
    // ...
}

final class SomeClass extends SomeClassSuper {
    // ...
}
于 2011-02-14T19:27:52.077 回答
1

不,不可能。您可以创建 class final,但这样会破坏现有的扩展。

也许可以通过为 APT 开发定制处理器来实现。但一般情况下不会强制执行。

于 2011-02-14T19:29:06.930 回答
1

如果它适合您的设计,您也许可以将所需的功能(例如后代需要访问的构造函数)设为私有,并提供扩展需要使用的受保护+弃用的构造函数。

于 2011-02-14T19:33:39.033 回答
0

@Deprecated 注解不支持这一点,你应该标记你的类final。虽然这会导致编译器错误,但它更合乎逻辑,要么扩展你的类是安全的,要么这样做是错误的。

于 2011-02-14T19:32:09.033 回答