29

场景:
Java 1.6

class Animal { 
    private String name; 
    ...  
    public String getName() { return name; }  
    ...
}

class CatDog extends Animal {
    private String dogName;
    private String catName;
    ...
    public String getDogName() { return dogName; }
    public String getCatName() { return catName; }
    public String[] getNames() { return new String[]{ catName, dogName }; }
    ...
    public String getName() { return "ERROR! DO NOT USE ME"; }
}

问题:
getName 没有意义,不应在本例中使用。我正在阅读 @Deprecated 注释。有没有更合适的注解方式?

问题:
A) 使用此函数时(运行时之前)是否可以强制出错?
B)有没有办法为我将使用的注释方法显示自定义的警告/错误消息?理想情况下,当用户将鼠标悬停在已弃用/错误功能上时。

4

4 回答 4

63

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

如果您想在使用该函数时在编译时导致错误,您可以更改编译器选项以将 @Deprecated 方法的使用视为错误而不是警告。当然,您不能保证使用您的库的每个人都会设置此选项,而且我不知道仅根据语言规范强制编译错误。从中删除该方法CatDog仍将允许客户端调用它,因为客户端只会从超类调用默认实现Animal(可能您仍希望包含该方法)。

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

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

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

于 2012-07-13T02:37:16.130 回答
18

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

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

如果您在有人将鼠标悬停在该方法上时想要自定义消息,请使用 javadoc,这正是它的用途:

/**
     * @deprecated
     * explanation of why function was deprecated, if possible include what 
     * should be used.
     */
于 2012-07-13T02:25:47.507 回答
4

重构我们的 User 类后,我们无法删除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;
    }
}

在此处输入图像描述

于 2019-12-09T09:52:43.057 回答
3

弃用是要走的路...您还可以将编译器配置为将某些事情标记为错误而不是警告,但正如爱德华指出的那样,您通常不推荐使用方法,这样您就不必完全清理此时所有对它的引用。

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

于 2012-07-13T03:13:18.880 回答