检查是否包含在子类

时间:2016-01-21 20:41:15

标签: java

我想要完成的是将#example字段设置为包含在可选项中的当前示例子类实例,如果contains对所有子类返回false我想返回一个Optional#empty < / p>

我有一个抽象类。

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());
}

这是所有伪代码,这不起作用。如果你们知道如何做到这一点并且可以解释我的意思很多:)

3 个答案:

答案 0 :(得分:2)

我不确定我是否完全理解你的问题,但似乎你在问一个标准的继承问题。

说我有一个例子列表。将示例设置为包含()的第一个示例,返回true:

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

如果这不是您要求的,可以尝试更多地澄清您的问题。

答案 1 :(得分:0)

这取决于用例。对于单例,可枚举(可列表)实例使用枚举,其中每个枚举常量都可以覆盖。

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();
    }
}

答案 2 :(得分:0)

杰森和我在他的问题的评论部分进行了讨论。

Jason,我相信你正在描述使用Decorator模式解决的功能。

基本上,您将拥有该类的必需对象,在您提供的示例中称为&#34;示例&#34;。您调用的其他类&#34;示例1&#34;和&#34;例2&#34;成为类的必需对象的装饰器或可选包装器。

我相信这可以回答你的问题,也就是所谓的设计模式。

这里有一个很好的教程: http://www.tutorialspoint.com/design_pattern/decorator_pattern.htm