Полиморфная фабрика / getInstance () в Java

Вы используете toUpperCase() в массиве euroTour, что недопустимо - это возможно только со строками. Сначала map массив в верхний регистр:

euroTour = euroTour.map(e => e.toUpperCase());

Затем вы можете использовать .includes() для этого:

euroTour.includes("FRANCE");

Демонстрация:

[ 1113]
var euroTour = ["France", "the Netherlands", "the UK", "Spain",
  "Portugal"
];

euroTour = euroTour.map(e => e.toUpperCase());

var findCountry = euroTour.includes("FRANCE");

11
задан slim 26 November 2008 в 11:45
поделиться

7 ответов

Статический метод определяется на родительском классе, и это называют статически также. Так, нет никакого способа знать в методе о вызове его на подклассе. Компилятор Java, вероятно, даже разрешает вызов статически к вызову к родительскому классу.

Таким образом, Вы должны будете или повторно реализовать статический метод в своих дочерних классах, как Вы предполагаете или делаете их не статичными, таким образом, Вы можете наследование (на иерархии объектов фабрики, не классах), или передавать параметр для выражения типа, Вы хотите создать.

Проверьте EnumSet.noneOf () метод. Это имеет подобную проблему, как Вы делаете, и это решает его путем передачи java.lang. Метод класса. Вы могли использовать newInstance на классе. Но лично, я просто использовал бы объекты фабрики, а не классы со статическими методами.

4
ответ дан 3 December 2019 в 08:57
поделиться

Вы изучили Guice? Не уверенный, если это решило бы Вашу проблему точно, но это действует как универсальная фабрика и контейнер внедрения зависимости, и устраняет небезопасные с точки зрения типов Строковые ключи.

5
ответ дан 3 December 2019 в 08:57
поделиться

Вы, кажется, подразумеваете, что где-нибудь знаете, каким классом это должно быть, если это не существует. При реализации той логики на фабрике, необходимо получить корректные классы.

Таким образом, у Вас не должно также быть потребности знать, какой класс на самом деле был возвращен из фабрики.

Я также, вероятно, сделал бы 'MyClass' интерфейсом, если Вы рассматриваете Шаблон "фабрика".

1
ответ дан 3 December 2019 в 08:57
поделиться

после чтения Вас объяснение проблемы я думаю Ваше создание его очень трудный для себя sub, классифицирующим в Вашей конструкции графика. я думаю, что проблема становится намного более простой при разделении графа зависимостей от "информации о программе"

используйте Интерфейс, такой как:

Public Interface Node<T> {
  public Object<T>    getObject();
  public String       getKey();
  public List<String> getDependencies();
  public void         addDependence(String dep);
}

и затем используйте фабрику для инстанцирования Вас узлы

2
ответ дан 3 December 2019 в 08:57
поделиться

Класс Класса параметризован с типом экземпляра, который он может создать. (исключая: Класс <Строка> является фабрикой для Строковых экземпляров.)

Я не вижу способа обойти знание типа экземпляра, который должен быть создан, когда Вы getOrCreate использование метода фабрики здесь, таким образом, я рекомендовал бы передать его методу и параметризовать на сгенерированном типе:

private static Map<String, MyClass> directory = new HashMap<String, MyClass>();

public static <T extends MyClass> T getInstance(String name, Class<T> generatorClass)
{
  MyClass node = directory.get(name);    
  if(node == null) {
    node = generatorClass.getConstructor(String.class).newInstance(name);
    directory.put(name, node);
  }
  return node;
}

Кроме того, я заметил, что Вы на самом деле не помещали недавно созданные узлы в каталог - я предполагаю, что это - контроль. Вы могли также перегрузить этот метод с другим, который не взял генератор и hardcoded к типу по умолчанию:

public static MyClass getInstance(String name) {
  return getInstance(name, MyClass.class);
}
1
ответ дан 3 December 2019 в 08:57
поделиться

Вы, вероятно, хотите внедрение зависимости. Это обобщило бы то, что Вы пытаетесь сделать несколько.

Кроме того, Наследование, вероятно, не точно, в чем Вы нуждаетесь также. Никогда не используйте его, если Вы не можете передать, "-" тест. Если Ваш наследованный класс "Имеет -" тег уникальной строки (по существу, это - то, что Ваш класс, кажется), это не означает, что это "-"...

Вы могли иметь, каждый содержит другой все же. Существует, вероятно, довольно много решений, но A) Вы не отправили свой весь список требований, таким образом, мы можем, но предполагать и B) то, что Вы, вероятно, хотите, является внедрением зависимости.:)

0
ответ дан 3 December 2019 в 08:57
поделиться

Шаблон, кажется, своего рода Боксер наилегчайшего веса (структурно, если не идеальная пара для намерения.)

populate метод, как описано, мог быть отображен на Template шаблон, хотя это не обязательно обращается к выраженным проблемам.

То, что я предложил бы, является обобщением фабрики с a create (вместо getInstance, который действительно подразумевает Singleton мне так или иначе), метод для различных типов, которые Вы ожидаете.

public static MyClass createJavaNode(String name, <differentiator>);
public static MyClass createSqlPlNode (String name, <differentiator>);
.
.
.

Знание, о как a name карты к a <differentiator> действительно выбор реализации. Идеально, было бы полиморфное create и дифференцирование было бы node ввести. create возвраты метода MyClass, но действительно возвращает подклассы. Я сильно рассмотрел бы создание MyClass или интерфейс или абстрактный класс, с abstract populate метод (существует Template).

Из описания действительно кажется, что это - поведение создания, которое отличается между типами, не поведением самих подклассов, таким образом, случай для рефакторинга MyClass к интерфейсному или абстрактному классу становится более сильным.

Перефразировать R. A. Heinlein, TANSTAAFL - Нет Такой Вещи Как Бесплатный Ланч - где-нибудь знание того, как создать различные типы, должен существовать в приложении. Таким образом, Ваш выбор состоит в том, чтобы поместить то знание в класс Фабрики, как некоторые из других ответов выразили, или разделить решение о том, какая реализация создается из того, как это создается. Кажется, что существует возможность сканирования файловой системы и сбора Nodes от него. Тот код будет (или может) знать тип Node (ответ на, какой), который должен быть создан.

Реализовано ли это как a switch или большим количеством способа OO (одно из времен, где табличная отправка была бы хороша) ваше дело. Если это - что-то, что могло бы быть полезно, я могу подробно остановиться на этом здесь.

BTW, если базовое поведение MyClass потребности, которые будут расширены или изменены для некоторых подклассов, это то, где a Decorator могло бы быть полезным.


Исходный ответ:

Вы могли бы рассмотреть Декоратора или Шаблон Шаблоны разработки как альтернативы.

0
ответ дан 3 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: