这是一个棘手的解释。我正在制作的是一个框架/库,可以将Java对象(理想情况下为bean)转换为GUI(各种适配器类将抽象UI对象转换为特定于平台的GUI),玩家可以在其中查看和编辑信息。这听起来像是一个安全漏洞,但是我正在从事的项目需要大量的用户选项编辑,因此非常理想。我决定解决这个问题的方法非常简单:
虽然我不确定如何处理。我给了自己2个选择:
编辑Properties接口以具有getValue()方法,并在创建ClassStructure时要求传递一个对象。这意味着ClassStructure不再是原型,而简单地说就是将getter方法映射到其返回值的Map。这有点慢,因为您必须为要为其创建菜单的每个对象重新创建ClassStructure。但是,它减少了膨胀的数量,这意味着我不必制作任何其他类即可获取值。
使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返回值,还是应该在一个类中完成所有映射?
感谢您的帮助。