1.7 怎么用好Java注解

本文内容是极客时间课程——代码精进之路中代码规范篇的学习笔记。

 

1.继承和重写带来的2个麻烦
(1)识别子类的方法是不是重写方法
比如下边的代码,对于阅读者来说,最直觉的感受就是,getFirstName()这个方法不是重写方法,父类Person没有定义这个方法。
class Student extends Person {
    // snipped
    public String getFirstName() {
        // snipped
    }
    // snipped
}
 
所以,如果一个方法是重写方法,一定要加上@Override注解。
 
使用@Override注解的另一个好处是:如果父类更改了方法,子类的编译就会出错。这样我们就能在第一时间获得通知,既可以及时地变更子类,也可以使父类的变更更加合理。
 
(2)重写方法可以不遵守父类方法的规范(子类重写的方法实现标准,与父类有差异)
比如父类有一个getFirstName方法,用来得到人名,不包括姓氏,而子类的实现得到人名整体。
 
虽然一般情况下,子类的重写方法不应该改变父类的规范。但是,编写代码处处充满了无奈和妥协。极少数情况下,除了变更方法的规范,我们可能别无选择。一旦这种情况发生,一定要明确标明,并注明潜在的后果。
 
 
2.在废弃退役接口的情况下,如何使用注解
软件接口的废弃,不是一件简单的事情,越是广泛使用的接口,它的废弃、退役越困难。
 
比如,下面的String构造方法,是1994年Java1.0设计实现的方法。很快,人们发现了这个方法的局限性。在1997年发布的Java 1.1中,废弃了该构造方法以及其他相关的方法。到现在,已经废弃20多年了,但Java依然没有删除这些方法,因为String的使用太广泛了!
@Deprecated(since="1.1")
public String(byte ascii[], int hibyte) {
    this(ascii, hibyte, 0, ascii.length);
}
 
无论对于软件的维护者,还是软件的使用者,废弃的接口都是不值得让我们继续耗费精力的。
 
如果软件的维护者继续在废弃的接口上投入精力,意味着这个接口随着时间的推移,它的实现可能会存在各种各样的问题,包括严重的安全问题,就连使用者也要承担这些风险。而且还会有用户持续把它们运用到新的应用中去,这就违背了废弃接口的初衷。更多的使用者加入危险的游戏,也增加了删除废弃接口的难度。
 
3.对于废弃接口的处理方式
(1)如果接口的设计存在不合理性,或者新方法取代了旧方法,我们应该尽早地废弃该接口。
做好这件事情,需要我们使用Deprecated注解,并且用一切可以使用的办法,广而告之。对于代码而言,要在声明中使用Deprecated注解;在规范描述中,说明废弃的原因以及替代的方法;对于有计划要删除的接口,要注明计划删除的版本号。
(2)如果我们在现有的代码中使用了废弃的接口,要尽快转换、使用替换的方法。
 
4.java代码中废弃接口的两个例子
java/lang/String.java:


/**
* Counts the number of stack frames in this thread. The thread must
* be suspended.
*
* @return     the number of stack frames in this thread.
* @throws     IllegalThreadStateException  if this thread is not
*             suspended.
* @deprecated The definition of this call depends on
*             {@link #suspend}, which is deprecated.  Further,
*             the results of this call were never well-defined.
*             This method is subject to removal in a future
*             version of Java SE.
* @see        StackWalker
*/
@Deprecated(since="1.2", forRemoval=true)
public native int countStackFrames();

 

java.security.Certificate.java:


/**
* <p>This is an interface of abstract methods for managing a
* variety of identity certificates.
*
* ... snipped ...
*
* @deprecated This class is deprecated and subject to removal
*     in a future version of Java SE. It has been replaced by
*     {@code java.security.cert.Certificate} and related classes.
* @see java.security.cert.Certificate
*/
@Deprecated(since="1.2", forRemoval=true)
public interface Certificate {
    // snipped
}
 
5.对于@SuppressWarnings注解
不要轻易地更改现有的代码,即使这些代码很丑陋,散发着浓浓的腐臭味。
但是,有一个例外,如果看到了使用@SuppressWarnings的代码,我们要尽可能地想办法把相关的警告消除掉、把这个注解去掉,越快越好。
 
posted @ 2020-11-08 20:35  徐浩进  阅读(130)  评论(0编辑  收藏  举报