首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化现场访问。我应该使用反射,还是有Java 8解决方案?

简化现场访问。我应该使用反射,还是有Java 8解决方案?
EN

Stack Overflow用户
提问于 2014-07-14 01:12:20
回答 2查看 378关注 0票数 0

我有以下示例类:

代码语言:javascript
复制
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返回相应布尔字段的值。

正如您在示例代码中所看到的那样:我编写了许多代码,以实现这一点,但我无法弄清楚如何简化操作。

有两件事我可以想象:

  1. 在构造函数中调用super(READ, UPDATE, DELETE);,并让超类通过反射处理isGranted(...)方法。
  2. 只需在构造函数中调用super();,类就会找到public static final String字段本身并动态创建字段和getter/setter,因为我的代码中不需要它们--它们只需要在运行时出现。

或者Java 8中有什么很酷的新特性,所以我可以这样做:

代码语言:javascript
复制
public MyPermission() {
  super(new HashMap<String, GetterMethod>() {{
    put(READ, this::isRead);
    put(UPDATE, this::isUpdate);
    put(DELETE, this::isDelete);
  }});
}

因此,我可以动态地调用相应的getter方法,例如:

代码语言:javascript
复制
public boolean isGranted(String permission) {
  return permissionMap.get(permission).execute();
}

(甚至使用字段,而不是getter方法)

如果这个:)有一个简单而又好的解决方案,那就太酷了

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-14 02:22:30

使用Java 8 @FunctionalInterface Supplier@FunctionalInterface Consumer怎么样?

代码语言:javascript
复制
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; }
}

这至少可以节省一些代码,但是:

  1. 它并不比上面的版本短多少,而且
  2. 这两个Map将产生一些开销。(可能很重要,因为当应用程序处于活动状态时,这些Permission对象每秒将被创建大约100到1000次)
票数 0
EN

Stack Overflow用户

发布于 2014-07-14 18:17:09

我会把Java8放在一边,而只是直接去设计模式,确切地说是策略。

您可以在每个情况下派生一个子类,也可以引入一个枚举。两者都是类型安全、可测试的,而且您也不会构建另一个以字符串为中心的应用程序。

所以你要么选择了这样的类

代码语言:javascript
复制
WritePermission extends BasePermission...
ReadPermission extends BasePermission...
BasePermission implements Permission...

或者像这样

代码语言:javascript
复制
public enum Permissions implements Permission {
  WRITE {public boolean isWrite{return true;}},
  READ {...}, 
  ...
  public boolean isWrite{return false;}
}

或者,当您使用枚举时,您完全可以从布尔方法中辞职,因为您只需要开始比较permissions和enum (但如果要执行权限层次结构(例如ReadWrite),这就不是很好的扩展)。在这种情况下,类更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24728366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档