我想使用@Deprecated注释仅废弃给定类的扩展,而不是类中包含的所有方法和字段。
也就是说,如果你扩展了给定类,则会出现警告 - 但对方法或字段的引用不会触发警告。已经有几个类扩展了这个类,我希望废弃警告针对这些客户端 - 我还不能打破它们(但它们可以重新编译 - 不需要ABI兼容性)。
在Java 1.6(JDT编译器)中是否可能实现?
我想使用@Deprecated注释仅废弃给定类的扩展,而不是类中包含的所有方法和字段。
也就是说,如果你扩展了给定类,则会出现警告 - 但对方法或字段的引用不会触发警告。已经有几个类扩展了这个类,我希望废弃警告针对这些客户端 - 我还不能打破它们(但它们可以重新编译 - 不需要ABI兼容性)。
在Java 1.6(JDT编译器)中是否可能实现?
两点考虑:
1)这个类可能已经被扩展了,所以不要将其标记为final,否则可能会破坏向后兼容性。
2)您不希望该类被扩展,因此应将其标记为final。
我认为您应该使用一个新类来扩展旧类,将旧类标记为已弃用,并声明新类为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 {
// ...
}
不行,绝对不行。你可以将类设置为final
,但这样会破坏现有的扩展。
也许通过开发APT的自定义处理器是可能的。但这在一般情况下不会被强制执行。
@Deprecated注解不支持此操作,您应该将您的类标记为final
。虽然这会导致编译器错误,但更加合理,因为要么可以安全地扩展您的类,要么就是扩展它是一个错误。