鏈檢驗器將像下面如何用Java
public class MyClass {
private Integer myField;
private Result result;
// more global variables
public MyResult check(Integer myParameter) {
init(myParameter);
if (myField < 0) {
result.setErrorMessage("My error message");
return result;
}
// a lot more 'checks' like above where something may be written
// to the error message and the result gets returned.
}
private void init(Integer myParameter) {
result = new Result();
result.setExistsAnnouncement(/*search a certain object via crudService with myParameter*/);
// initialize other global variables including myField
}
}
問題一類是上面的check
方法是太長,有許多return
語句。我想到了一些重構,但我仍然不確定要做什麼。我在想像一個連鎖模式。然後,我會執行幾個檢查員類,他們或者調用鏈中的下一個檢查器,或者返回result
與相應的errorMessage
。
但是後來我有了一個更好的主意(至少我這麼認爲):爲什麼不像java 8那樣表現?我想過使用像Try
- Success
- Failure
- 模式。但我不知道如何實現這一點。我想到的是這樣的:
entrancePoint.check(firstChecker)
.check(secondChecker)
.check // and so on
的想法是:當check
失敗時,它會表現得像Optional.map()
和返回類似的Optional.EMPTY
(或在這方面有點像Failure
)。當check
成功時,它應該繼續下一步檢查(返回Success
)。
你有這樣的經驗嗎?
我以前做過同樣的事情,但沒有鏈接。我做到這一點的方式是1.)創建一個'Checkable'接口,它包含一個方法'check()',它需要拋出一些'CheckFailedException',以及這個接口的一些具體實現。 2.)在'MyClass'中創建'List'變量,並且'MyClass'中的check()遍歷每個checkable元素並在其上調用check()。 3.)使用構造函數或setter方法初始化要執行的檢查列表(我使用的是spring,所以我是這麼做的)。 –
Jay
是的,這可能有效。但我認爲那裏有更好的解決方案。目前我仍然試圖通過Try-Failure-Success-Pattern來完成此項工作,如下所示:https://dzone.com/articles/whats-wrong-java-8-part-iv。區別在於:在鏈接他們做例外...我使用此嘗試成功失敗實現btw:https://gist.github.com/mariofusco/8287951 – Chris311
你可以使用Hibernate驗證器,如果你在編譯時知道約束條件? http://hibernate.org/validator/ –