Вы используете toUpperCase()
в массиве euroTour
, что недопустимо - это возможно только со строками. Сначала map
массив в верхний регистр:
euroTour = euroTour.map(e => e.toUpperCase());
Затем вы можете использовать .includes()
для этого:
euroTour.includes("FRANCE");
Демонстрация:
var euroTour = ["France", "the Netherlands", "the UK", "Spain",
"Portugal"
];
euroTour = euroTour.map(e => e.toUpperCase());
var findCountry = euroTour.includes("FRANCE");
Статический метод определяется на родительском классе, и это называют статически также. Так, нет никакого способа знать в методе о вызове его на подклассе. Компилятор Java, вероятно, даже разрешает вызов статически к вызову к родительскому классу.
Таким образом, Вы должны будете или повторно реализовать статический метод в своих дочерних классах, как Вы предполагаете или делаете их не статичными, таким образом, Вы можете наследование (на иерархии объектов фабрики, не классах), или передавать параметр для выражения типа, Вы хотите создать.
Проверьте EnumSet.noneOf () метод. Это имеет подобную проблему, как Вы делаете, и это решает его путем передачи java.lang. Метод класса. Вы могли использовать newInstance на классе. Но лично, я просто использовал бы объекты фабрики, а не классы со статическими методами.
Вы изучили Guice? Не уверенный, если это решило бы Вашу проблему точно, но это действует как универсальная фабрика и контейнер внедрения зависимости, и устраняет небезопасные с точки зрения типов Строковые ключи.
Вы, кажется, подразумеваете, что где-нибудь знаете, каким классом это должно быть, если это не существует. При реализации той логики на фабрике, необходимо получить корректные классы.
Таким образом, у Вас не должно также быть потребности знать, какой класс на самом деле был возвращен из фабрики.
Я также, вероятно, сделал бы 'MyClass' интерфейсом, если Вы рассматриваете Шаблон "фабрика".
после чтения Вас объяснение проблемы я думаю Ваше создание его очень трудный для себя sub, классифицирующим в Вашей конструкции графика. я думаю, что проблема становится намного более простой при разделении графа зависимостей от "информации о программе"
используйте Интерфейс, такой как:
Public Interface Node<T> {
public Object<T> getObject();
public String getKey();
public List<String> getDependencies();
public void addDependence(String dep);
}
и затем используйте фабрику для инстанцирования Вас узлы
Класс Класса параметризован с типом экземпляра, который он может создать. (исключая: Класс <Строка> является фабрикой для Строковых экземпляров.)
Я не вижу способа обойти знание типа экземпляра, который должен быть создан, когда Вы 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);
}
Вы, вероятно, хотите внедрение зависимости. Это обобщило бы то, что Вы пытаетесь сделать несколько.
Кроме того, Наследование, вероятно, не точно, в чем Вы нуждаетесь также. Никогда не используйте его, если Вы не можете передать, "-" тест. Если Ваш наследованный класс "Имеет -" тег уникальной строки (по существу, это - то, что Ваш класс, кажется), это не означает, что это "-"...
Вы могли иметь, каждый содержит другой все же. Существует, вероятно, довольно много решений, но A) Вы не отправили свой весь список требований, таким образом, мы можем, но предполагать и B) то, что Вы, вероятно, хотите, является внедрением зависимости.:)
Шаблон, кажется, своего рода Боксер наилегчайшего веса (структурно, если не идеальная пара для намерения.)
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
- Нет Такой Вещи Как Бесплатный Ланч - где-нибудь знание того, как создать различные типы, должен существовать в приложении. Таким образом, Ваш выбор состоит в том, чтобы поместить то знание в класс Фабрики, как некоторые из других ответов выразили, или разделить решение о том, какая реализация создается из того, как это создается. Кажется, что существует возможность сканирования файловой системы и сбора Node
s от него. Тот код будет (или может) знать тип Node
(ответ на, какой), который должен быть создан.
Реализовано ли это как a switch
или большим количеством способа OO (одно из времен, где табличная отправка была бы хороша) ваше дело. Если это - что-то, что могло бы быть полезно, я могу подробно остановиться на этом здесь.
BTW, если базовое поведение MyClass
потребности, которые будут расширены или изменены для некоторых подклассов, это то, где a Decorator
могло бы быть полезным.
Исходный ответ:
Вы могли бы рассмотреть Декоратора или Шаблон Шаблоны разработки как альтернативы.