科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道侵入,无侵入? Annotation vs Interface

侵入,无侵入? Annotation vs Interface

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

1. Interface    使用Interface 定义对象的类型,框架根据对象的接口来提供服务,这种模式是古而有之的Java框架设计者必习之法,从最重量的EJB到最轻量的Spring,都离不开这种方式,也的确解决了很多问题。

作者:中国IT实验室 来源:中国IT实验室 2007年9月24日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

 

Interface是这样实现的:

Interface 定义:

public interface UndeletableEntity {
    
void setStatus(String status);
}

Interface 在Entity使用:

public class Book implements UndeletableEntity {
  
private String status;  public void setStatus(String status) {
   
this.status = status;
  }
 }

Interface 在框架中使用:

//根据Class 判断
if(UndeletableEntity.class.isAssignableFrom(entityClass)){
    ...
}

//根据Bean实体判断
if(bean instanceof UndeletableEntity{
   ((UldeletableEntity)bean).setStatus(
"-1");
}

    大家都很熟悉的写法,就不解释了。

Annotation是这样实现的:

   Annotation 定义:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Undeletable {
  String status() 
default "status";
}

   原本怪Sun怎么这么抠门,用@interface 而不另外搞一个关键字,原来Sun的意思就是把Interface和Annotation的定位一样呀。

   @Target 定义Annotation 可用于的地方,比如类型,函数,函数参数等。Type代表Class,Interface...

   @Retention(RetentionPolicy.RUNTIME)表明是个运行期的annotation,否则后面的代码都不会起作用。

   String status() 定义了annotation有个status的属性,而且可以不定义,默认为status。

   Annotation在Entity使用:

@Undeletable
  
public class Book{
    
private String status;
     
public void setStatus(String status) {
        
this.status = status;
     }
  }

@Undeletable(status 
= "status2")
    
public class BookWithNewStatus {
    
private String status2;
    
public void setStatus2(String status2) {
        
this.status2 = status2;
    }
}

Annotation在框架中的使用:

if (entityClass.isAnnotationPresent(Undeletable.class)) {
    Undeletable anno 
= (Undeletable) entityClass.getAnnotation(Undeletable.class);
    statusProperty 
= anno.status();
}

   可见,annotation的模式,比interface要少一点侵入性,不定死status列的名称,而且还可以灵活定义更多元属性,比如定义无效时的值为"-1","unvalid"。

   但是,这种模式也和所有动态的东西向一样,失去了编译期校验的优势,POJO如果没有setStatus() 这个函数在编译期也检查不出来。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章