2015-06-23 6 views
0

Пример: У меня есть абстрактный класс «животное» и подкласс «лев» и «тигр». Имя подкласса написано в поле «Форма» NotesDocument. Как создать bean с именем animal с классом «Tiger» или «Lion» во время выполнения.Как установить класс bean во время выполнения

Мой план: Я делаю фасоль с управляемым bean-name «животным», управляемым bean-классом «AnimalFactory». Тогда где-то, где ?, Я хочу (псевдокод)

Document doc = database.getDocById("AAAA"); //from docId parameter 
String animalType = doc.getItemValueString("Form"); 
if (animalType.equals("Lion") return makeLionInstance(); 
else return makeTigerInstance(); 

Может кто-то мне точку в правильном направлении или дать мне пример?

EDIT

Я гавань изучить любые ответы, предоставляемые ... Сделаю завтра.

Проблема заключается в том, что проект LoC 100k-300k и никто не знает, что именно он делает. Это 15 лет и имеет 30-50 разработчиков. Во всяком случае, мы решили пойти в Интернет. В java мы видим отличную возможность переписать проект в java (как многие уже сделали), удалить избыточный код, определить интерфейсы и т. Д. (И позже, когда не задействованы никакие объекты MS, замените Java-код кодом LS) ... У нас есть 6 разных (с аналогичной базой) типов doc (form) с подтипами, и каждый тип имеет 5 различных рабочих процессов, которые являются исключительными.

У меня нет знаний о том, как создать экземпляр определенного класса из notesdocument во время выполнения. Одним из способов является предоставление переменных базовому классу и их создание во время выполнения на основе поля «Форма». У меня такое чувство, этого в конечном итоге не хватит.

Как и в моем «плане», я ДУМАЮ, что у меня есть смутное представление о том, что нужно сделать. Я не знаю, где вставлять код, и то, что я должен быть осторожным.

TL: DR

Как иметь экземпляр типа, определенного на поле документа «Форма» разрешен к управляемому компоненту во время выполнения.

+0

Есть, вероятно, много способов решения этой проблемы в Java (см ответов ниже), но я хотел бы иметь немного больше контекста. Почему вы хотите использовать управляемый компонент (они переоценены в XPages) и что вы пытаетесь сделать? Я больше не использую управляемые компоненты и, как правило, привязываю XPages, пользовательские элементы управления и/или панели к источнику данных ''. В свойстве createObject вы можете легко решить, какой класс Java использовать. См. Также http://www.slideshare.net/thimojansen/xpages-22933454 –

+0

Не могли бы вы изменить свой вступительный абзац и вместо того, чтобы * объяснить * ваш пример, на самом деле дать пример кода? –

ответ

0

Заводской шаблон будет достаточным, и улучшение этого будет похоже на инициализацию карты с ключом как имя и значение подкласса животного как фактический экземпляр.

animalMap.put("Lion", LionObject); 
animalMap.put("Tiger", TigerObject); 

из формы получить ключ и вернуть экземпляр. например, если значение из формы Тигр, то вы можете получить экземпляр как

animalMap.get("value passed from the map") --> animalMap.get("Tiger"). 
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(); 
} 
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; 
    } 
} 
1

Я думаю, this article был революционным в то время. Это помогло мне взять под контроль управляемые бобы. Получите вдохновение от этого и создайте фабричный зоопарк, реализующий интерфейс Map.Ваш метод get(String) будет создавать или восстанавливать объект животного на основе его имени.

Ваш EL/SSJS будет легко, как:

#{zoo.lion} 
#{javascript:zoo.get("Lion").roar()} 
+0

Съемка через статью, класс bean-компонента не изменяется во время выполнения. Я хочу чего-то без «зоопарка». Например # {javascript: lion.roar()} или в java if (insanceof (animal) .equals ("Lion")) animal.roar(); без этого – Ermo

Смежные вопросы