From Gossip@caterpillar

Java Essence: ¦Û­q¤p¦Ñ¹««¬ºA



 


§A¥i¥H¦Û­qAnnotation«¬§O¡A¨Ã¨Ï¥Î³o¨Ç¦Û­qªºAnnotation«¬§O¦bµ{¦¡½X¤¤¨Ï¥Î Annotation¡A³o¨ÇAnnotation±N´£¨Ñ¸ê°Tµ¹§Aªºµ{¦¡½X¤ÀªR¤u¨ã¡C

­º¥ý¨Ó¬Ý¬Ý¦p¦ó©w¸qMarker Annotation¡A¤]´N¬OAnnotation¦WºÙ¥»¨­§Y´£¨Ñ¸ê°T¡A¹ï©óµ{¦¡¤ÀªR¤u¨ã¨Ó»¡¡A¥D­n¬OÀˬd¬O§_¦³Marker Annotationªº¥X²{¡A¨Ã§@¥X¹ïÀ³ªº°Ê§@¡C

­n©w¸q¤@­ÓAnnotation©Ò»Ýªº°Ê§@¡A´NÃþ¦ü©ó©w¸q¤@­Ó¤¶­±¡]interface¡^¡A¥u¤£¹L§A¨Ï¥Îªº¬O@interface¡A¨Ò¦p©w¸q¤@­Ó Debug Annotation«¬ºA¡G
package cc.openhome;
public @interface Debug {}

¥Ñ©ó¬O­ÓMarker Annotation¡A©Ò¥H¨S¦³¥ô¦óªº¦¨­û¦bùØÀY¡A½sͧ¹¦¨«á¡A§A´N¥i¥H¦bµ{¦¡½X¤¤¨Ï¥Î³o­ÓAnnotation¤F¡A¨Ò¦p¡G
package cc.openhome;
import java.util.*;
public class SomeObject {
    @Debug   
    public void doSomething() {
        // ....
    }
}

±µµÛ¨Ó¬Ý¬Ý¦p¦ó©w¸q¤@­ÓSingle-value Annotation¡A¥¦¥u¦³¤@­Ó¦¨­û¡A¦WºÙ¬°value¡A¨Ò¦p§A¥i¥H´£¨ÑDebug Annotation§ó¦h¸ê°T¡G
package cc.openhome;
public @interface Debug {
     String value();
}

¹ê»Ú¤W§A©w¸q¤Fvalue()¤èªk¡A½s;¹¦b½sͮɷ|¦Û°ÊÀ°§A²£¥Í¤@­ÓvalueªºÅܼƦ¨­û¡A±µµÛ¦b¨Ï¥ÎDebug Annotation®É­n«ü©w­È¡A¨Ò¦p¡G
package cc.openhome;
import java.util.*;
public class SomeObject {
    @Debug("unit test")
    public void doSomething() {
        // ....
    }
}

@Debug("unit test")¹ê»Ú¤W¬O@Debug(value="unit test")ªºÂ²«K¼gªk¡A¦pªG¬O°}¦C­È¡A¨Ò¦p¡G
package cc.openhome;
public @interface Debug {
     String[] value();
}

«h¨Ï¥ÎAnnotation®É¡A¥i¥H¼g¦¨@Debug({"value1", "value2"})¡A©Î¬O@Debug(value={"value1", "value2"})¡C

§A¤]¥i¥H¹ï¦¨­û³]©w¹w³]­È¡A¨Ï¥ÎdefaultÃöÁä¦r§Y¥i¡A¨Ò¦p¡G
package cc.openhome;
public @interface Debug {
    String value() default "none";
}

³o»ò¤@¨Ó¦pªG§A¨Ï¥Î@Debug®É¨S¦³«ü©w­È¡A«h¹w³]´N¬O"none"¡C

§A¤]¥i¥H¬°Annotation©w¸qÃB¥~ªº¦¨­û¡A¥H´£¨ÑÃB¥~ªº¸ê°Tµ¹¤ÀªR¤u¨ã¡A¨Ò¦p¡G
package cc.openhome;
public @interface Debug {
    public enum Level {NONE, UNIT, INTEGRATION, FUNCTION};
    Level level() default Level.NONE;
    String name();
    String tester();
}

«h§A¥i¥H¦p¤U¨Ï¥Î³o­ÓAnnotation¡G
package cc.openhome;
import java.util.*;
public class SomeObject {
    @Debug(
       level = Debug.Level.UNIT,
       name = "some test",
       tester = "justin"
    )
    public void doSomething() {
        // ....
    }
}

@interface¹ê»Ú¤W¬O¦Û°ÊÄ~©Ó¦Ûjava.lang.annotation.Annotation¡A©Ò¥H©w¸qAnnotation®É¤£¯àÄ~©Ó¨ä¥¦ Annotation©Î¬Ointerface¡C

©w¸q§ÎºA¥u¬O¶}©l¡AAnnotationªº¥Øªº¦b©ó´£¨Ñ¸ê°T¡AÃö©ó´£¨Ñ¸ê°T¡AÁÙ¦³³\¦h­n¤F¸Ñªº¡A½ÐÄ~Äò©¹¤U¤@½g¶i¦æ¡C