Day30:附魔

Annotation,大概最常见的就是@Override了,当我们写的类别继承自其他类别时,要覆写父类别的方法,假设不小心打错父类别方法的名称,或者参数、返回型态不一致,那@Override就会在IDE或者编译时期告诉我们这个方法可能没有覆写到父类别的方法哦~(因为父类别没有同样签章的方法)。

这个Annotation我们也可以自己写,首先要先这样:

public @interface CustomAnnotation { }

很像定义介面,不过interface前面要加个"@"。

然後我们可以帮它加属性:

public @interface CustomAnnotation {
    String value();
    String[] author() default "";
}

属性後面不像定义类别,需要多加"()",可以往setter和getter的感觉想像吧!
如果我们定义有value的属性,那它在单独指派时可以直接指派值,不需要先写出属性名称後再打"=";可以看到author属性後面写了关键字default,这就代表是预设的属性值,假若Annotation在定义的时候属性没有给预设值,那使用时就必须给那个属性值:

public class Student{

    @CustomAnnotation(value = "Midterm")
    public void doTest(){}
    
    @CustomAnnotation("Final")
    public void doTest2(){}
    
    @CustomAnnotation(value = "Pickup", author={"Johnny", "Andy"})
    public void haveFun(){}
}

因为@CustomeAnnotation的value没有预设值,势必都要指派value属性的值过去,而author属性可以不指派,那就是预设的""。

Annotation的属性型别是有限制的,只能是primitive, String, Class, enum, annotation及其阵列型式:

public @interface CustomAnnotation {
    publci enum Difficulty{EASY, MEDIUM, HARD}
    
    String value();
    String[] author() default "";
    Difficulty difficulty() default Difficulty.EASY;
}

Annotation除了可以贴在其他人身上,自己身上也可以贴Annotation,不过只有4种可以贴:

  • @Document,若有人贴上我们的Annotation,让java doc可以显示出来有贴上这个Annotation
  • @Retention,其内定义有enum RetentionPolicy:SOURCE, CLASS, RUNTIME
  • @Target,其内定义有enum ElementType,例如ElementType.TYPE, ElementType.METHOD等等,代表可以贴在什麽成员身上
  • @Inherited,预设标签是不会继承给子类别的,只有标注有@Inherited的标签会传承给子类别

针对@Retention多说明一点,Java预设是RetentionPolicy.CLASS,代表说在编译时期结束後会保留在.class档案,但是执行时期无法取用;而RetentionPolicy.SOURCE代表编译时期会取用,但编译完不会存成.class档案;而RetentionPolicy.RUNTIME就代表执行时期也可以透过java.lang.reflect.AnnotatedElement套件的功能取用到Annotation的属性内容:

public static void main(String[] args){
    Student student0 = new Student();
    Method doTest = student0.getClass().getMethod("doTest");
    CustomAnnotation ca = doTest.getAnnotation(CustomAnnotation.class);
    ca.value();
    ca.author();
    ca.difficulty();
}
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
    publci enum Difficulty{EASY, MEDIUM, HARD}
    
    String value();
    String[] author() default "";
    Difficulty difficulty() default Difficulty.EASY;
}

<<:  [Day 28] Final Project (4/5) — 部署模型到 Google AI Platform

>>:  学习Python纪录Day28 - 在多文字档中搜寻关键字

[自学笔记] URL Encoding

URL Encoding(URL编码) URL 编码将字符转换为可以通过 Internet 传输的格...

[Day 30] 阿嬷成为网页前端工程师的下一步

阿嬷成为网页前端工程师的下一步 尽管篇幅长短不一,我们在这 30 天当中讨论了怎麽写 HTML 标签...

Day29 自动合成物品的小乌龟与指令

上次已经玩过挖矿龟 Mining Turtle,此外还有其他几个类似的小乌龟 包括 Digging ...

Re: 新手让网页 act 起来: Day30 - React hooks 之 useDebugValue

前言 今天要介绍最後一个 React hook - useDebugValue ,它也是个较少使用的...

爬虫怎麽爬 从零开始的爬虫自学 DAY14 python条件运算式

前言 各位早安,书接上回我们练习了条件判断语法 if else elif 的用法,今天我们要来介绍它...