我想只弃用给定类的扩展,而不是使用@Deprecated 注解包含在一个类中的所有方法和字段。
也就是说,如果您扩展给定的类,则会出现警告 - 但对方法或字段的引用不会触发警告。已经有几个类扩展了这个类,我想让弃用警告针对这些客户端——我还不能破坏它们(但它们可以重新编译——不需要 ABI 兼容性)。
Java 1.6(JDT 编译器)有可能吗?
我想只弃用给定类的扩展,而不是使用@Deprecated 注解包含在一个类中的所有方法和字段。
也就是说,如果您扩展给定的类,则会出现警告 - 但对方法或字段的引用不会触发警告。已经有几个类扩展了这个类,我想让弃用警告针对这些客户端——我还不能破坏它们(但它们可以重新编译——不需要 ABI 兼容性)。
Java 1.6(JDT 编译器)有可能吗?
两个考虑
1) 该类可能已经扩展,因此不要将其标记为 final,否则可能会破坏向后兼容性。
2)你不希望类扩展,所以它应该被标记为final。
我认为您应该做的是用新类扩展旧类,将旧类标记为已弃用,并将新类声明为最终类。在新类中,您可以添加 @SuppressWarning 标记来消除不推荐使用的消息,然后您应该会得到一个干净的编译。
使用旧类的代码将收到@Deprecated 警告,但仍会编译。使用新类的代码将编译干净。对您的用户来说是一种“强烈建议”,而不是向后兼容的中断,并且由于 API 100% 兼容,因此他们很容易修复。
我怀疑这是否可以使用@Deprecated
注释。
但是,如果您可以控制源,则可以执行以下操作:
SomeClass
为SomeClassSuper
SomeClass
并让它扩展SomeClassSuper
。SomeClass
final (防止客户扩展它)。也就是说,从
class SomeClass {
// ...
}
class SubClass extends SomeClass {
// ...
}
到
class SomeClassSuper {
// ...
}
class SubClass extends SomeClassSuper {
// ...
}
final class SomeClass extends SomeClassSuper {
// ...
}
不,不可能。您可以创建 class final
,但这样会破坏现有的扩展。
也许可以通过为 APT 开发定制处理器来实现。但一般情况下不会强制执行。
如果它适合您的设计,您也许可以将所需的功能(例如后代需要访问的构造函数)设为私有,并提供扩展需要使用的受保护+弃用的构造函数。
@Deprecated 注解不支持这一点,你应该标记你的类final
。虽然这会导致编译器错误,但它更合乎逻辑,要么扩展你的类是安全的,要么这样做是错误的。