Хорошо, так что вы не можете объявить свой метод «public static abstract» в суперклассе, но вы можете сказать своим коллегам просто включить метод, который «public static» возвращает SuperClass и не принимает аргументов, а затем найти этот метод отражается на вашей фабрике:
public static class Main {
public static void main(String[] args) {
List<Class> classes.....// get classes extend from SuperClass by reflection.
List<SuperClass> res = new ArrayList<>();
for (Class<?> clazz : classes) {
for (Method method : clazz.getMethods()) {
if (isStatic(method) && returnsSuperClass(method) && hasNoParameters(method)) {
res.add((SuperClass) method.invoke(null));
}
}
}
}
public static boolean hasNoParameters(Method method) {
return method.getParameterTypes().length == 0;
}
public static boolean returnsSuperClass(Method method) {
return SuperClass.class.isAssignableFrom(method.getReturnType());
}
public static boolean isStatic(Method method) {
return (method.getModifiers() & Modifier.STATIC) == Modifier.STATIC;
}
}
Используйте хеш-таблицу и сделайте это:
// Initialise the set
mySet = {};
// Add to the set
mySet["some string value"] = true;
...
// Test if a value is in the set:
if (testValue in mySet) {
alert(testValue + " is in the set");
} else {
alert(testValue + " is not in the set");
}
Комментарий к вышеупомянутым решениям для хеша. На самом деле {} создает объект (также упомянутый выше), который может привести к некоторым побочным эффектам. Один из них - то, что Ваш "хеш" уже предварительно заполняется с методами объекта по умолчанию.
Так "toString" in setOfValues
будет true
(по крайней мере, в Firefox). Можно предварительно ожидать другой символ, например,"." к строкам, чтобы работать вокруг этой проблемы или использовать объект Хеша, обеспеченный "опытной" библиотекой.
Можно использовать объект как так:
// prepare a mock-up object
setOfValues = {};
for (var i = 0; i < 100; i++)
setOfValues["example value " + i] = true;
// check for existence
if (setOfValues["example value 99"]); // true
if (setOfValues["example value 101"]); // undefined, essentially: false
Это использует в своих интересах то, что объекты реализованы как ассоциативные массивы. Как быстро, который является, зависит от Ваших данных и реализации механизма JavaScript, но можно сделать некоторое тестирование производительности легко для сравнения с другими вариантами выполнения его.
Если значение может произойти несколько раз в Вашем наборе и, "как часто" важно для Вас, можно также использовать число постепенного увеличения вместо булевской переменной, которую я использовал для своего примера.
Возможный путь, особенно эффективный, если набор неизменен, но все еще применим с переменным набором:
var haystack = "monday tuesday wednesday thursday friday saturday sunday";
var needle = "Friday";
if (haystack.indexOf(needle.toLowerCase()) >= 0) alert("Found!");
Конечно, Вы, возможно, должны были бы изменить разделитель в зависимости от строк, которые необходимо поместить там...
Более устойчивый вариант может включать границы для обеспечения ни "дня, связанного узами брака", ни "дня", может соответствовать положительно:
var haystack = "!monday!tuesday!wednesday!thursday!friday!saturday!sunday!";
var needle = "Friday";
if (haystack.indexOf('!' + needle.toLowerCase() + '!') >= 0) alert("Found!");
Могло бы быть не нужным, если вход уверен (например, из базы данных, и т.д.).
Я использовал это в сценарии Механика с преимуществом использования стога сена непосредственно из устройства хранения данных GM.
Используя хеш-таблицу могла бы быть более быстрая опция.
Безотносительно опции Вы идете для, который определенно стоит проверить ее производительность против альтернатив, которые Вы рассматриваете.
Зависит от сколько значений, там.
Если существует несколько значений (меньше чем 10 - 50), перерывая массив могут быть в порядке. Хеш-таблица могла бы быть излишеством.
Если у Вас есть много значений, хеш-таблица является наилучшим вариантом. Требуется меньше работы, чем сортировка значений и выполнение двоичного поиска.