2016年1月14日 星期四

來個標註吧 - Java annotation

Annotation在java裡,是給編譯器看的,
作用是告訴編譯器去做什麼,或是不做什麼。

Annotation package:
import java.lang.annotation.*;
先來看看它的語法,通常長的像這樣:
@annotation
或是這樣:
@annotation(value)
@annotation(element=value)
Annotation可指定element的值,或是直接傳入值。
它可以針對java的任何元素,
例如package、class、function、member...等進行標註。
像是這樣子:
class smaple{
    @Override
    public function overrideFunc(){
    }
}
那麼Annotation到底有什麼用,
我們來看看內建的幾個annotation。

@Override

告訴編譯器這個方法要覆蓋父類的方法,
例如上面的例子就是。
使用Override可以確保程式一定會覆蓋,
而不是變成重載。

@SuppressWarnings

這是告訴編譯器不要發出警告。
下面這個程式碼,編譯器會發出falling through warning。
switch("b"){
    case "a": break;
    case "b": //falling through
    case "c": break;
}
如果加上@SuperssWarnings annotation就不會發出警告。
@SuppressWarnings
private fallingThroughFunc(char x){
    switch(x){
        case "a": break;
        case "b": //falling through
        case "c": break;
    }
}
常用的參數有這些:
all
finally
unchecked
serial
fallthrough
path
你可以在命令列下這個指令,查到全部的參數
javac -X

@Deprecated

這個是純粹用來說明的,
告知開發者這個元素不建議使用,
請使用新的元素。
@Deprecated
public void deprecatedFunc(){
}

meta annotation

meta annotation是註釋的註釋,
annotation for annotation,好繞口啊。

@Retention

它告訴編譯器這個annotation的存在時期。
下方的例子,是告訴編譯器Deprecated一直到runtime都存在,
表示程式執行期同樣可以存取到。
@Retention(value=RUNTIME)
@Deprecated

Retention的參數有這些:
import java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.RetentionPolicy.SOURCE;
import java.lang.annotation.RetentionPolicy.CLASS;

@Inherited

使用Inherited來註釋一個class,
那麼它的子class也會繼承這個註釋。

@Documented

製作javadoc時,
使用Documented註釋某個annotation,
那麼這個被註釋的annotation會包含在javadoc中。

@Target

Target指明這個annotation可用在哪些元素。
import java.lang.annotation.ElementType.*;

@Target(ElementType.METHOD)
public @interface TargetSample{}
表示TargetSample只能用在mehtod。
@Target可以有多個值,像是這樣。
import java.lang.annotation.ElementType.*;

@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
public @interface TargetSample{}

沒有留言:

張貼留言