课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java程序建议:枚举和注解结合
  • java程序建议:枚举和注解结合

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-28

  • 昆明Java培训机构的老师发现枚举和注解结合使用威力更大

    昆明Java培训机构的老师知道注解的写法和接口很类似,都采用了关键字interface,而且都不能有实现代码,常量定义默认都是public static final 类型的等,它们的主要不同点是:注解要在interface前加上@字符,而且不能继承,不 实现,这经常会给我们的开发带来些障碍。

    昆明Java培训机构的老师来分析一下ACL(Access Control  List,访问控制列表)设计案例,看看如何避免这些障碍,ACL有三个重要元素:

    资源,有哪些信息是要被控制起来的。

    权限级别,不同的访问者规划在不同的级别中。

    控制器(也叫鉴权人),控制不同的级别访问不同的资源。

    鉴权人是整个ACL的设计核心,我们从最主要的鉴权人开始,代码如下:

    interface Identifier{

    //无权访问时的礼貌语

    String REFUSE_WORD = "您无权访问";

    //鉴权

    public boolean identify();

    }

    这是一个鉴权人接口,定义了一个常量和一个鉴权方法。接下来应该实现该鉴权方法,但问题是我们的权限级别和鉴权方法之间是紧耦合,若分拆成两个类显得有点啰嗦,怎么办?昆明Java培训机构的老师可以直接顶一个枚举来 现,代码如下:

    1 enum CommonIdentifier implements Identifier {

    2    //权限级别

    3    Reader, Author, Admin;

    4

    5    @Override

    6    public boolean identify() {

    7        return false;

    8    }

    9

    10 }

    定义了一个通用鉴权者,使用的是枚举类型,并且实现了鉴权者接口。现在就剩下资源定义了,这很容易定义,资源就是我们写的类、方法等,之后再通过配置来决定哪些类、方法允许什么级别的访问,这里的问题是:怎么把 源和权限级别关联起来呢?使用XML配置文件?是个方法,但对我们的示例程序来说显得太繁重了,如果使用注解会更简洁些,不过这需要我们首先定义出权限级别的注解,代码如下:

    1 @Retention(RetentionPolicy.RUNTIME)

    2 @Target(ElementType.TYPE)

    3 @interface Access{

    4    //什么级别可以访问,默认是管理员

    5    CommonIdentifier level () default CommonIdentifier.Admin;

    6 }

    该注解释标注在类上面的,并且会保留到运行期。我们定义一个资源类,代码如下:

    @Access(level=CommonIdentifier.Author)

    class Foo{

    }

    Foo类只能是作者级别的人访问。场景都定义完毕了,那我们看看如何模拟ACL实现,代码如下:

    1 public static void main(String[] args) {

    2        //初始化商业逻辑

    3        Foo b = new Foo();

    4        //获取注解

    5        Access access = b.getClass().getAnnotation(Access.class);

    6        //没有Access注解或者鉴权失败

    7        if (null == access || !access.level().identify()) {

    8            //没有Access注解或者鉴权失败

    9            System.out.println(access.level().REFUSE_WORD);

    10        }

    11    }

    看看这段代码,简单,易读,而且如果我们是通过ClassLoader类来解释该注解的,那会使我们的开发更简洁,所有的开发人员只要增加注解即可解决访问控制问题。注意看加粗代码,access是一个注解类型,我们想使用Identifier接口 identity鉴权方法和REFUSE_WORD常量,但注解释不能集成的,那怎么办?此处,可通过枚举类型CommonIdentifier从中间做一个委派动作(Delegate),委派?你可以然identity返回一个对象,或者在Identifier上直接定义一个常量对象,那就是“赤裸裸 ”的委派了。

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:java程序建议:小心注解继承

下一篇:java程序建议:注意@Override不同版本的区别

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56