仅弃用类继承

时间:2011-02-14 19:24:52

标签: java warnings deprecated eclipse-jdt

我想使用@Deprecated注释仅弃用给定类的扩展名,而不是弃用类中包含的所有方法和字段。

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

是否可以在Java 1.6(JDT编译器)中使用?

5 个答案:

答案 0 :(得分:5)

两个注意事项

1)该课程可能已经延期,所以不要将其标记为最终版,否则可能会破坏向后兼容性。

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

我认为你应该做的是用新类扩展旧类,标记旧类被弃用,并声明新类final。在新类中,您可以添加@SuppressWarning标记以静默已弃用的消息,然后您应该进行清理编译。

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

答案 1 :(得分:4)

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

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

  1. 将当前班级SomeClass重命名为SomeClassSuper
  2. 创建一个名为SomeClass的新类,并让它扩展SomeClassSuper
  3. 使SomeClass成为最终版(这会阻止客户对其进行扩展)。
  4. 即从

    开始
    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。虽然这会导致编译器错误,但它更符合逻辑,或者扩展您的类是安全的,或者这样做是错误的。