示例:我有一个抽象类"动物"和子类" lion"和老虎"。子类名称写在NotesDocument字段" Form"。我如何使用class" Tiger"创建名为animal的bean。或者"狮子"在运行时。
我的计划是:我用一个bean-name" animal",managed-bean-class" AnimalFactory"来制作一个bean。然后某处,哪里?,我想(伪代码)
Document doc = database.getDocById("AAAA"); //from docId parameter
String animalType = doc.getItemValueString("Form");
if (animalType.equals("Lion") return makeLionInstance();
else return makeTigerInstance();
有人能指出我正确的方向还是举个例子?
修改
我没有研究提供的任何答案......明天会这样做。
问题是我们有100k-300k的LoC项目,没有人知道它到底在做什么。它已有15年历史,有30-50名开发人员。无论如何,我们决定去网络。在java中,我们看到了将项目重写为java(很多人已经完成),删除冗余代码,定义接口等(后来,没有涉及MS对象,用LS代码替换java代码)的很好的机会......我们有6个不同的(具有类似基础)doc(form)类型与子类型,每种类型有5个不同的工作流程,这是独家的。
我不知道如何在运行时从notesdocument实例化特定的类。一种解决方法是向基类提供变量,并在运行时基于字段" Form"实例化它们。我有一种感觉,从长远来看这是不够的。
正如在我的"计划"中,我认为我对必须做的事情有一个模糊的概念。我不知道在哪里插入代码,也不知道我必须小心。
TL:DR
如何在文档字段中定义类型实例" Form"在运行时解析为托管bean。
答案 0 :(得分:1)
我认为this article当时是革命性的。它帮助我控制了托管bean。从中受到启发并使工厂bean Zoo实现Map接口。您的get(String)
方法将根据动物对象的名称进行实例化或检索。
您的EL / SSJS将很容易:
#{zoo.lion}
#{javascript:zoo.get("Lion").roar()}
答案 1 :(得分:0)
工厂模式就足够了,对此的增强就像用动画子类名称和值作为实际实例初始化地图一样。
animalMap.put("Lion", LionObject);
animalMap.put("Tiger", TigerObject);
从表单获取密钥并返回实例。例如,如果表单中的值是Tiger,那么您可以获得类似
的实例animalMap.get("value passed from the map") --> animalMap.get("Tiger").
答案 2 :(得分:0)
针对特定问题有很多解决方案,它们取决于你要去哪里。
我首先要创建一个AnimalFactory接口。
interface AnimalFactory<T extends Animal> {
T create();
}
然后,我会创建一个映射:
private final Map<String, AnimalFactory<?>> factories = initFactories();
private Map<String, AnimalFactory<?>> initFactories() {
final Map<String, AnimalFactory<?>> factories = new HashMap<>();
// Note, in Java 8, you can simplify these anonymous classes to "Tiger::new" and "Lion::new".
factories.put("lion", new AnimalFactory<Lion>() {
public void create() { return new Lion(); }
});
factories.put("tiger", new AnimalFactory<Tiger>() {
public void create() { return new Tiger(); }
});
return map;
}
public Animal createAnimal(String type) {
final AnimalFactory<?> factory = factories.get(type.toLowercase());
if (factory == null) { return null; }
return factory.create();
}
答案 3 :(得分:0)
您可以将enums
用作factory
模式,它们也是singleton
。
package com.test;
public enum AnimalFarm {
LION(new Lion()),
TIGER(new Tiger());
private Animal animal;
private AnimalFarm(Animal animal) {
this.animal = animal;
}
private static Animal getAnimalByName(String name) {
return AnimalFarm.valueOf(name.toUpperCase()).animal;
}
}