我想使用@Deprecated注释仅弃用给定类的扩展名,而不是弃用类中包含的所有方法和字段。
也就是说,如果扩展给定的类会发出警告 - 但对方法或字段的引用不会触发警告。已经有几个类扩展了这个类,我想让弃用警告针对这些客户端 - 我还不能破坏它们(但它们可以重新编译 - 不需要ABI兼容性)。
是否可以在Java 1.6(JDT编译器)中使用?
答案 0 :(得分:5)
两个注意事项
1)该课程可能已经延期,所以不要将其标记为最终版,否则可能会破坏向后兼容性。
2)你不希望扩展类,所以它应该标记为final。
我认为你应该做的是用新类扩展旧类,标记旧类被弃用,并声明新类final。在新类中,您可以添加@SuppressWarning标记以静默已弃用的消息,然后您应该进行清理编译。
使用旧类的代码将获得@Deprecated警告,但仍将编译..使用新类的代码将干净地编译。对您的用户而言是一种“强烈建议”,而不是向后兼容的中断,并且由于API 100%兼容,因此很容易修复。
答案 1 :(得分:4)
我怀疑使用@Deprecated
注释是否可行。
如果您可以控制来源,则可以执行以下操作:
SomeClass
重命名为SomeClassSuper
SomeClass
的新类,并让它扩展SomeClassSuper
。SomeClass
成为最终版(这会阻止客户对其进行扩展)。即从
开始class SomeClass {
// ...
}
class SubClass extends SomeClass {
// ...
}
到
class SomeClassSuper {
// ...
}
class SubClass extends SomeClassSuper {
// ...
}
final class SomeClass extends SomeClassSuper {
// ...
}
答案 2 :(得分:1)
不,没办法。您可以创建课程final
,但这样您就会破坏现有的扩展程序。
也许通过为APT开发自定义处理器是可能的。但在一般情况下不会强制执行。
答案 3 :(得分:1)
如果它符合您的设计,您可以将所需的功能(例如后代需要访问的构造函数)设为私有,并提供受保护的+弃用的构造函数,扩展需要使用它。
答案 4 :(得分:0)
@Deprecated注释不支持此功能,您应该标记您的班级final
。虽然这会导致编译器错误,但它更符合逻辑,或者扩展您的类是安全的,或者这样做是错误的。