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

时间:2012-07-13 02:20:46

标签: java annotations

情境:
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 个答案:

答案 0 :(得分:52)

通常,对于已被较新版本的软件淘汰的方法,您使用@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标记,他们肯定会在运行时注意到它。)

答案 1 :(得分:16)

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

是的,当有人试图使用该方法时,有一个简单的方法来获取编译错误:删除方法 - 这会导致任何试图使用它的代码在链接时出错,通常不建议出于显而易见的原因,但如果有一个非常好的理由来打破向后兼容性,那么这是实现它的最简单方法。您还可以使方法签名不兼容(始终可行),但实际上最简单的解决方案通常是最好的。

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

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

答案 2 :(得分:3)

重构了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;
    }
}

enter image description here

答案 3 :(得分:2)

不推荐是可行的方法......您还可以将编译器配置为将某些内容标记为错误而不是警告,但正如Edward指出的那样,您通常会弃用某个方法,这样您就不必在这个时间点完全清理所有对它的引用。

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