1700446776
编写高质量代码:改善Java程序的151个建议 建议91:枚举和注解结合使用威力更大
1700446777
1700446778
我们知道注解的写法和接口很类似,都采用了关键字interface,而且都不能有实现代码,常量定义默认都是public static final类型的等,它们的主要不同点是:注解要在interface前加上@字符,而且不能继承,不能实现,这经常会给我们的开发带来一些障碍。
1700446779
1700446780
我们来分析一个ACL(Access Control List,访问控制列表)设计案例,看看如何避免这些障碍,ACL有三个重要元素:
1700446781
1700446782
资源,有哪些信息是要被控制起来的。
1700446783
1700446784
权限级别,不同的访问者规划在不同的级别中。
1700446785
1700446786
控制器(也叫鉴权人),控制不同的级别访问不同的资源。
1700446787
1700446788
鉴权人是整个ACL的设计核心,我们从最主要的鉴权人开始,代码如下:
1700446789
1700446790
interface Identifier{
1700446791
1700446792
//无权访问时的礼貌语
1700446793
1700446794
String REFUSE_WORD=“您无权访问”;
1700446795
1700446796
//鉴权
1700446797
1700446798
public boolean identify();
1700446799
1700446800
}
1700446801
1700446802
这是一个鉴权人接口,定义了一个常量和一个鉴权方法。接下来应该实现该鉴权方法,但问题是我们的权限级别和鉴权方法之间是紧耦合,若分拆成两个类显得有点啰嗦,怎么办?我们可以直接定义一个枚举来实现,代码如下:
1700446803
1700446804
enum CommonIdentifer implements Identifier{
1700446805
1700446806
//权限级别
1700446807
1700446808
Reader, Author, Admin;
1700446809
1700446810
//实现鉴权
1700446811
1700446812
public boolean identify(){
1700446813
1700446814
return false;
1700446815
1700446816
}
1700446817
1700446818
}
1700446819
1700446820
定义了一个通用鉴权者,使用的是枚举类型,并且实现了鉴权者接口。现在就剩下资源定义了,这很容易定义,资源就是我们写的类、方法等,之后再通过配置来决定哪些类、方法允许什么级别的访问,这里的问题是:怎么把资源和权限级别关联起来呢?使用XML配置文件?是个方法,但对我们的示例程序来说显得太繁重了,如果使用注解会更简洁些,不过这需要我们首先定义出权限级别的注解,代码如下:
1700446821
1700446822
@Retention(RetentionPolicy.RUNTIME)
1700446823
1700446824
@Target(ElementType.TYPE)
[
上一页 ]
[ :1.700446775e+09 ]
[
下一页 ]