2016-01-21 159 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

呃,我不知道我將如何檢索任何子類的#容器,並設置類實例作爲我的字段。 –