我想要完成的是将#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());
}
这是所有伪代码,这不起作用。如果你们知道如何做到这一点并且可以解释我的意思很多:)
答案 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