2016-01-21 157 views
3

我试图做到的是设置#示例领域当前实施的子类的实例包裹在一个可选的,如果包含的回报上,我想所有的子类假返回一个可选#空检查是否包含在子类

我有一个抽象类。

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类型的每个对象都是Example1或Example2,而不是两者。 –

+0

这听起来像你有困惑的类与实例。你不会“遍历子类”;您将循环访问数组或实例的集合或流。 – VGR

+0

每个类只有一个调用'contains()'的实现。 –

回答

2

我不知道我完全理解你的问题,但似乎你问一个标准的继承问题。

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

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

如果这不是你问什么,也许试图澄清你的问题多一点。

+0

我不想将类的实例存储在集合中,但您所做的正是我正在寻找的内容。我试图使用反射来检查包含是否在任何子类上返回true,并返回该类的一个实例。 –

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

没有考虑使用枚举类型,我从来不知道你可以使用这样的供应商,虽然,谢谢你:) –

0

Jason和我在他的问题的评论部分的讨论。

杰森,我相信你所描述的是解决使用Decorator模式的功能。

从本质上讲,你将有类,它在您提供的例如被称为“示例”的要求的对象。您称为“Example1”和“Example2”的其他类成为装饰器,或者是类的所需对象上的可选包装器。

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

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

+0

呃,我不知道我将如何检索任何子类的#容器,并设置类实例作为我的字段。 –