Java函数注释帮助,是否使用@Deprecated?

Java函数注释帮助,是否使用@Deprecated?,java,annotations,Java,Annotations,场景: Java 1.6 问题: getName没有意义,不应该在本例中使用。我正在阅读关于@Deprecated注解的文章。是否有更合适的注释方法 问题: A) 使用此函数时(运行前)是否可能强制出错? B) 有没有办法为我将使用的注释方法显示自定义的警告/错误消息?理想情况下,当用户将鼠标悬停在已弃用/错误函数上时。弃用意味着不应再使用该方法,并且可能在将来的版本中删除该方法。基本上就是你想要的 是的,当有人试图使用该方法时,有一种非常简单的方法可以获得编译错误:删除该方法-这将导致任何试图

场景:
Java 1.6

问题:
getName没有意义,不应该在本例中使用。我正在阅读关于@Deprecated注解的文章。是否有更合适的注释方法

问题:
A) 使用此函数时(运行前)是否可能强制出错?

B) 有没有办法为我将使用的注释方法显示自定义的警告/错误消息?理想情况下,当用户将鼠标悬停在已弃用/错误函数上时。

弃用意味着不应再使用该方法,并且可能在将来的版本中删除该方法。基本上就是你想要的

是的,当有人试图使用该方法时,有一种非常简单的方法可以获得编译错误:删除该方法-这将导致任何试图使用该方法的代码在链接时出错,通常由于明显的原因不推荐使用,但如果真的有很好的理由破坏向后兼容性,这是实现该方法的最简单方法。您也可以使方法签名不兼容(总是可能的),但实际上最简单的解决方案通常是最好的

如果您希望在有人悬停在方法上时获得自定义消息,请使用javadoc,这正是它的用途:

/**
     * @deprecated
     * explanation of why function was deprecated, if possible include what 
     * should be used.
     */

通常,对于较新版本的软件已经过时的方法,您使用@Deprecated,但是为了与依赖于旧版本的代码保持API兼容性,您保留了@Deprecated。我不确定它是否是这个场景中使用的最佳标记,因为getName仍然被
Animal
的其他子类积极使用,但它肯定会提醒
CatDog
类的用户不应该调用该方法

如果您想在使用该函数时在编译时引起错误,则可以更改编译器选项,以考虑使用@弃用方法作为错误而不是警告。当然,您不能保证使用您的库的每个人都会设置此选项,而且我知道没有办法仅仅根据语言规范强制编译错误。从CatDog

CatDog
中删除该方法仍将允许客户端调用它,因为客户端将只调用超类
Animal
中的默认实现(您可能仍然希望包含该方法)

但是,当用户将鼠标悬停在不推荐使用的方法上时,当然可以显示自定义消息。Javadoc@deprecated标记允许您指定方法被弃用的原因的解释,当用户在类似Eclipse的IDE中悬停在方法上时,它将弹出,而不是通常的方法描述。它看起来是这样的:

/**
 * 
 * @deprecated Do not use this method!
 */
 @Deprecated
 public String getName() {
     throw new UnsupportedOperationException();
 }

(请注意,您可以让方法的实现抛出一个异常,以保证如果用户在编译时没有注意到@Deprecated标记,他们肯定会在运行时注意到它)。

Deprecated是一种方法。。。您还可以将编译器配置为将某些内容标记为错误而不是警告,但正如Edward指出的那样,您通常不赞成某个方法,这样您就不必在此时完全清除对它的所有引用


在Eclipse中,要配置错误和警告,请转到窗口->首选项。在Java->Compiler->Errors/Warnings下,您将看到不推荐使用的API的部分。当方法不推荐使用时,您可以选择指示编译器忽略、警告或出错。当然,如果您与其他开发人员合作,他们必须以相同的方式配置编译器。

重构我们的用户类后,我们无法删除
userGuid
属性,因为它被移动应用程序使用。因此,我将其标记为已弃用。好的方面是开发工具,如IntellijIdea能够识别它并显示消息

public User {
    ...

    /**
     * @Deprecated userGuid equals to guid but SLB mobile app is using user_guid.
     * This is going to be removed in the future.
     */
    @Deprecated
    public String getUserGuid() {
        return guid;
    }
}

我需要基类中的方法:/谢谢,我忽略了抛出异常。这似乎是我的最佳选择。我是否也必须使用@Override来确保基类函数不被使用?
@Override
对于重写的工作来说不是必需的-它只是一个有用的注释,告诉您何时要重写一个方法,如果您确实没有重写,编译器会警告您(因为你把它拼错了)。如果存在重写,则基类函数将不会在子类中使用,无论它是否具有
@override
。引发这样的异常意味着您没有弃用该函数,而是实际删除了它。但是,您这样做的方式会在运行时而不是在编译时被注意到。在这种情况下,您应该删除该函数,这样在编译时就可以清楚地看到您不能这样做。
public User {
    ...

    /**
     * @Deprecated userGuid equals to guid but SLB mobile app is using user_guid.
     * This is going to be removed in the future.
     */
    @Deprecated
    public String getUserGuid() {
        return guid;
    }
}