弃用类继承?

9

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

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

在Java 1.6(JDT编译器)中是否可能实现?


鉴于迄今为止的答案,我需要允许类继续扩展该类,因为我目前无法移除依赖关系,但我希望它们在这样做时能够获得弃用警告。 - BeeOnRope
2
感谢您的回答。最终,以下解决方案都不是完全适当的(使用final是不可行的,因为我想要警告而不是中断),所以我选择了废弃子类必须使用的受保护构造函数,这具有类似的效果(每个扩展一个弃用警告)。 - BeeOnRope
5个回答

6

两点考虑:

1)这个类可能已经被扩展了,所以不要将其标记为final,否则可能会破坏向后兼容性。

2)您不希望该类被扩展,因此应将其标记为final。

我认为您应该使用一个新类来扩展旧类,将旧类标记为已弃用,并声明新类为final。在新类中,您可以添加@SuppressWarning标签以消除已弃用的消息,然后您仍然可以获得干净的编译。

使用旧类的代码将收到@Deprecated警告,但仍将编译。 使用新类的代码将会编译无误。 这对您的用户来说是一种“强烈建议”,而不是向后兼容的断裂,而且很容易修复,因为API是100%兼容的。


将此作为答案标记,因为它最符合我所需的要求——一种警告消费者不要扩展类的方式,而不会真正破坏它们或在每次方法调用时发出警告。 - BeeOnRope

4

我怀疑使用@Deprecated注释不可能实现这一点。

如果您可以控制源代码,可以按照以下步骤操作:

  1. 将当前类SomeClass重命名为SomeClassSuper
  2. 创建一个名为SomeClass的新类,并使其扩展SomeClassSuper
  3. SomeClass设置为final(防止客户端对其进行扩展)。

也就是说,从

class SomeClass {
    // ...
}

class SubClass extends SomeClass {
    // ...
}

为了

class SomeClassSuper {
    // ...
}

class SubClass extends SomeClassSuper {
    // ...
}

final class SomeClass extends SomeClassSuper {
    // ...
}

1

不行,绝对不行。你可以将类设置为final,但这样会破坏现有的扩展。

也许通过开发APT的自定义处理器是可能的。但这在一般情况下不会被强制执行。


1
如果符合您的设计,您可以将所需功能(例如后代需要访问的构造函数)设为私有,并提供一个受保护的+已弃用的构造函数,扩展程序需要使用该构造函数。

0

@Deprecated注解不支持此操作,您应该将您的类标记为final。虽然这会导致编译器错误,但更加合理,因为要么可以安全地扩展您的类,要么就是扩展它是一个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接