我有以下示例类:
public class MyPermission implements Permission {
public static final String READ = "read";
public static final String UPDATE = "update";
public static final String DELETE = "delete";
@Override
public boolean isGranted(String permission) {
switch(permission) {
case READ: return read;
case UPDATE: return update;
case DELETE: return delete;
default: return false;
}
}
private boolean read;
public boolean isRead() { return read; }
public void setRead(boolean read) { this.read = read; }
private boolean update;
public boolean isUpdate() { return update; }
public void setUpdate(boolean update) { this.update = update; }
private boolean delete;
public boolean isDelete() { return delete; }
public void setDelete(boolean delete) { this.delete = delete; }
}我想简化一些事情,因为会有更多的这些类被创建。模式总是相同的:
public final static String权限(必须在注释中可访问)isGranted返回相应布尔字段的值。正如您在示例代码中所看到的那样:我编写了许多代码,以实现这一点,但我无法弄清楚如何简化操作。
有两件事我可以想象:
super(READ, UPDATE, DELETE);,并让超类通过反射处理isGranted(...)方法。super();,类就会找到public static final String字段本身并动态创建字段和getter/setter,因为我的代码中不需要它们--它们只需要在运行时出现。或者Java 8中有什么很酷的新特性,所以我可以这样做:
public MyPermission() {
super(new HashMap<String, GetterMethod>() {{
put(READ, this::isRead);
put(UPDATE, this::isUpdate);
put(DELETE, this::isDelete);
}});
}因此,我可以动态地调用相应的getter方法,例如:
public boolean isGranted(String permission) {
return permissionMap.get(permission).execute();
}(甚至使用字段,而不是getter方法)
如果这个:)有一个简单而又好的解决方案,那就太酷了
提前感谢!
发布于 2014-07-14 02:22:30
使用Java 8 @FunctionalInterface Supplier和@FunctionalInterface Consumer怎么样?
public abstract class Permission {
Map<String, Supplier<Boolean>> permissionGetterMap = new HashMap<>();
Map<String, Consumer<Boolean>> permissionSetterMap = new HashMap<>();
public void put(String permission, Supplier<Boolean> getter, Consumer<Boolean> setter) {
permissionGetterMap.put(permission, getter);
permissionSetterMap.put(permission, setter);
}
public boolean isGranted(String permission) {
return permissionGetterMap.get(permission).get();
}
public void setPermission(String permission, boolean granted) {
permissionSetterMap.get(permission).accept(granted);
}
}
public class MyPermission extends Permission {
public static final String READ = "read";
public static final String UPDATE = "update";
public static final String DELETE = "delete";
public MyPermission() {
put(READ, this::isRead, this::setRead);
put(UPDATE, this::isUpdate, this::setUpdate);
put(DELETE, this::isDelete, this::setDelete);
}
private boolean read;
public boolean isRead() { return read; }
public void setRead(boolean read) { this.read = read; }
private boolean update;
public boolean isUpdate() { return update; }
public void setUpdate(boolean update) { this.update = update; }
private boolean delete;
public boolean isDelete() { return delete; }
public void setDelete(boolean delete) { this.delete = delete; }
}这至少可以节省一些代码,但是:
Map将产生一些开销。(可能很重要,因为当应用程序处于活动状态时,这些Permission对象每秒将被创建大约100到1000次)发布于 2014-07-14 18:17:09
我会把Java8放在一边,而只是直接去设计模式,确切地说是策略。
您可以在每个情况下派生一个子类,也可以引入一个枚举。两者都是类型安全、可测试的,而且您也不会构建另一个以字符串为中心的应用程序。
所以你要么选择了这样的类
WritePermission extends BasePermission...
ReadPermission extends BasePermission...
BasePermission implements Permission...或者像这样
public enum Permissions implements Permission {
WRITE {public boolean isWrite{return true;}},
READ {...},
...
public boolean isWrite{return false;}
}或者,当您使用枚举时,您完全可以从布尔方法中辞职,因为您只需要开始比较permissions和enum (但如果要执行权限层次结构(例如ReadWrite),这就不是很好的扩展)。在这种情况下,类更好。
https://stackoverflow.com/questions/24728366
复制相似问题