在了解了前面的内置注解和元注解之后,就可以定义自己需要的注解。直接上例子:
我们写一个程序:我们将实现一个售票站,站内向人群提供三种规格的票:成人票、儿童票、情侣票。上代码(无注解):
1.定义接口 Ticket:
package myAnnotation;
public interface Ticket {
public float getPrice();
}
2.定义三种类型的票,实现Ticket接口,重写getPrice()方法:
package myAnnotation;
public class AdultTicket implements Ticket{
@Override
public float getPrice() {
return 10.0f;
}
}
package myAnnotation;
public class ChildrenTicket implements Ticket{
@Override
public float getPrice() {
return 5.0f;
}
}
package myAnnotation;
public class CoupleTicket implements Ticket{
@Override
public float getPrice() {
return 18.0f;
}
}
3.定义TicketOffice类,实现购票:
package myAnnotation;
public class TicketOffice {
public Ticket init(String name){
if(name == null){
throw new IllegalArgumentException("请输入需要票的类型!");
}
if("Adult".equals(name)){
return new AdultTicket();
}
if("Children".equals(name)){
return new ChildrenTicket();
}
if("Couple".equals(name)){
return new CoupleTicket();
}
throw new IllegalArgumentException("没有 "+name+" 类型的票。");
}
public static void main(String[] args) {
TicketOffice to = new TicketOffice();
Ticket t = to.init("Couple");
System.out.println("票价为 "+t.getPrice()+"元。");
}
}
运行结果:
票价为 18.0元。
我们加上注解的代码如下:
1.定义接口 Ticket:
package myAnnotation2;
public interface Ticket {
public float getPrice();
}
2.自定义Factory注解:
package myAnnotation2;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Factory {
Class type(); // 工程名字
String id(); //生成什么对象
}
3.定义三种类型票,实现Ticket接口,重写getPrice()方法,添加注解:
package myAnnotation2;
import myAnnotation2.Ticket;
@Factory(id = "Adult",type = Ticket.class)
public class AdultTicket implements Ticket{
@Override
public float getPrice() {
return 10.0f;
}
}
package myAnnotation2;
import myAnnotation2.Ticket;
@Factory(id = "Children",type = Ticket.class)
public class ChildrenTicket implements Ticket{
@Override
public float getPrice() {
return 5.0f;
}
}
package myAnnotation2;
import myAnnotation2.Ticket;
@Factory(id = "Couple",type = Ticket.class)
public class CoupleTicket implements Ticket{
@Override
public float getPrice() {
return 18.0f;
}
}
4.创建TicketFactory:
package myAnnotation2;
public class TicketFactory {
public Ticket creat(String id){
if (id == null) {
throw new IllegalArgumentException("请输入需要票的类型!");
}
if ("Adult".equals(id)) {
return new AdultTicket();
}
if ("Children".equals(id)) {
return new ChildrenTicket();
}
if ("Couple".equals(id)) {
return new CoupleTicket();
}
throw new IllegalArgumentException("没有 "+id+" 类型的票。");
}
}
5.那么这时候TicketOffice代码应该是这个样子的:
package myAnnotation2;
public class TicketOffice {
private TicketFactory factory = new TicketFactory();
public Ticket init(String id){
return factory.creat(id);
}
public static void main(String[] args) {
TicketOffice to = new TicketOffice();
Ticket t = to.init("Couple");
System.out.println("票价为 "+t.getPrice()+"元。");
}
}
在TicketOffice和TicketFactory中,我们可以利用getDeclaredAnnotations()方法等来获取注解中的信息。我们也可以在注解中加入售票地址、使用时间等等一系列信息。
总结一下:创建自定义注解与编写接口很相似,除了它的接口关键字前有个@符号。注解可以跟踪代码的依赖性,实现代替配置文件的功能。能够更容易读懂别人写的代码,特别是框架相关的代码。比较常见的是Spring等框架中的基于注解配置。关于注解更多的理解和使用方法、场景,需要大家去实践,这里仅仅是一些简单的理解。
最后贴一下注解知识点导图,图示网上拿来的。联系删:
联系我: