2016-01-21 3 views
3

То, что я пытаюсь выполнить, устанавливается в поле #example для текущего экземпляра поддиректория примера, завернутого в необязательный, если contains возвращает false во всех подклассах, которые мне нужны для возврата Необязательный # пустойПроверить, существует ли в подклассах

У меня есть абстрактный класс.

public abstract class Example { 

public abstract boolean contains(); 

} 

У меня тогда есть некоторые подклассы.

public final class Example1 extends Example { 

@Override 
public boolean contains() { 
return true; 
} 

} 

public final class Example2 extends Example { 

@Override 
public boolean contains() { 
return true; 
} 

} 

и у меня есть поле, чтобы определить, какой пример в настоящее время присутствует.

private final Optional<Example> example; 

Есть ли способ перебрать подклассы и вернуть условие #contains?

что-то вроде

Optional<Class> clazz = Some sort of loop to check if the #contains condition returns true; 

затем установить мой пример поля

if(clazz.isPresent()) { 
setExample((Example) clazz.get()); 
} 

все это псевдо-код, это не будет работать. Если вы, ребята, знаете, как это сделать, и могли бы объяснить мне, что это значило бы :)

+0

Можете ли вы подробнее объяснить, что вы спрашиваете, когда вы говорите «есть способ перебрать подклассов и вернуть #contains состояние»? Что вы подразумеваете под циклом подклассов? Каждый объект типа Example представляет собой пример 1 или Example2, а не оба. –

+0

Похоже, вы путаете классы с экземплярами. Вы не будете «перебирать подклассы»; вы будете проходить через массив или коллекцию или поток экземпляров. – VGR

+0

Каждый класс имеет только одну реализацию 'contains()' для вызова. –

ответ

2

Я не уверен, что полностью понимаю ваш вопрос, но, похоже, вы задаете стандартный вопрос о наследовании.

Скажем, у меня есть список примеров. Установить пример первому, для которых содержит() возвращает истину:

List<Example> examples = Arrays.asList(new Example1(), new Example2(), ...); 
for (Example ex: examples) { 
    if (ex.contains()) { 
     example = ex; 
     break; 
    } 
} 

Если это не то, что вы просили, возможно, попытаться уточнить ваш вопрос немного больше.

+0

Я не хочу хранить экземпляры классов в коллекции, но то, что вы делаете, именно то, что я ищу. Я пытаюсь использовать отражение, чтобы проверить, возвращает ли true true в любом из подклассов и возвращает экземпляр этого класса. –

0

Это зависит от прецедента. Для singleton перечисляемые экземпляры перечисляют enum, где каждая константа перечислителя может переопределяться.

public enum Example { 
    EXAMPLE1() { 

     @Override 
     public abstract boolean contains() { 
      return true; 
     } 
    }, 
    EXAMPLE2() { 
     ... 
    }, 
    EXAMPLE3() { 
     ... 
    }; 

    public abstract boolean contains(); 
} 

Или в Java 8 передать функцию в конструктор:

public enum Example { 
    EXAMPLE1(() -> true), 
    EXAMPLE2(() -> false), 
    EXAMPLE3(() -> System.currentMillis() % 2 == 0); 

    private final Supplier<Boolean> cont; 

    private Example(Supplier<Boolean> cont) { 
     this.cont = cont; 
    } 

    public boolean contains() { 
     return cont.get(); 
    } 
} 
+0

Не изучая использование перечисляемого типа, я никогда не знал, что вы можете использовать таких поставщиков, хотя, спасибо за это :) –

0

Джейсон и я имел беседу в комментариях его вопроса.

Джейсон, я полагаю, вы описываете функциональность, решающую использование шаблона Decorator.

По существу, у вас будет необходимый объект класса, который в приведенном примере называется «Пример». Другие классы, которые вы назвали «Example1» и «Example2», становятся декораторами или необязательными обертками на требуемом объекте класса.

Я считаю, что это отвечает на ваш вопрос и является тем, что известно как шаблон дизайна.

Хороший учебник здесь: http://www.tutorialspoint.com/design_pattern/decorator_pattern.htm

+0

Умм, я не уверен, как бы получить #contains любого из подклассов и установить, что класс как мое поле. –

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