原型和有价值的原型与公正的原型

时间:2019-04-14 12:38:15

标签: java reflection javabeans

这是一个棘手的解释。我正在制作的是一个框架/库,可以将Java对象(理想情况下为bean)转换为GUI(各种适配器类将抽象UI对象转换为特定于平台的GUI),玩家可以在其中查看和编辑信息。这听起来像是一个安全漏洞,但是我正在从事的项目需要大量的用户选项编辑,因此非常理想。我决定解决这个问题的方法非常简单:

  1. 扫描给定类的字段并遍历
  2. 如果该字段具有关联的getter和/或setter,则将其包装到“ Properties”对象中,否则将其保留原样
  3. 从属性创建“ ClassStructure”,该属性本质上是JavaScript原型,但省略了构造函数和其他内容。
  4. 使用此结构创建带有GUIAdapter类的GUI。但是,它随后必须使用这些属性从给定对象获取其返回值。

虽然我不确定如何处理。我给了自己2个选择:

  1. 编辑Properties接口以具有getValue()方法,并在创建ClassStructure时要求传递一个对象。这意味着ClassStructure不再是原型,而简单地说就是将getter方法映射到其返回值的Map。这有点慢,因为您必须为要为其创建菜单的每个对象重新创建ClassStructure。但是,它减少了膨胀的数量,这意味着我不必制作任何其他类即可获取值。

  2. 使Properties的getValue()方法获取一个对象以从中获取值,并创建一种“ ValuedClassStructure”类,该类包含所有方法和字段及其对应的值。然后,我必须创建一个ValuedClassStructure工厂,该工厂使用ClassStructure和一个对象,扫描所有Properties,并将它们映射到该对象的值。这应该快于ClassStructures的高速缓存,因此要生成ValuedClassStructures,例如说要30个String对象,就如同调用每个getter方法一样简单。但是,它使项目变得更加more肿(从经验上来说,我以前使用过这种方法,变得非常像“意大利面”,因此我正在重写),具有更多的接口,实现和工厂。

这很难解释,甚至可能更难以解释,所以我将在一个伪代码类型的例子中尝试

这是选项1。ClassStructures是按实例而不是按类的,这意味着它们的生成速度较慢,因为我们没有太多的缓存,但是彼此之间的类和相关性较少。

interface ClassSearcher {
        ClassStructure ofClass(Class clazz, Object holderObject);
    }

    interface ClassStructure {
        Object getHolderObject();
        Set<Property> getProperties();
    }

    interface Property<V> {
        V getValue();
    }

这是选项2。ClassStructures是每个类的,ValuedStructures是每个实例的。 为了获取吸气剂到值的映射,我们首先创建一个原型ClassStructure,然后从该原型创建ValuedStructure。

interface ClassSearcher {
    ClassStructure ofClass(Class clazz);
    ValuedStructure getValues(ClassStructure structure, Object holder);
}

interface ClassStructure {
    Set<Property> getProperties();
}

interface Property<V> {
    V getValue(Object o);
}

interface ValuedStructure {
    Object getHolderObject();
    Set<ValuedProperty> getProperties();
}

interface ValuedProperty<V> {
    V getValue();
}

目前,我倾向于选择2,仅仅是因为它速度更快,并且在编写时仔细考虑意味着它不会变得像“意大利面”一样。但是,我很想听听其他人必须说的话。我可能完全忽略了选项3,而它所采取的只是另一种观点。 如果有人想尝试并了解大局,我目前拥有的一切都在https://github.com/knightzmc/jui中,原始项目为jui-core,重写为jui-core-new(完成后将重命名)。

TL; DR: 将Java bean转换为GUI。应该制作一个类似JavaScript的原型,然后分别映射getter返回值,还是应该在一个类中完成所有映射?

感谢您的帮助。

0 个答案:

没有答案