С Optional
вам нужно развернуть / проверить Optional
, чтобы получить его, и вы также получите исключение раннего опустошения, если Optional
используется неправильно (принцип быстрого отказа).
Например:
public static void main(String[] args) {
System.out.println("Normal back");
Browser browser = new Browser();
// unwraping the optional or testing it is mandatory to get the object inside in
browser.back().ifPresent(browser::retrieveSite);
// for example it will not compile
browser.retrieveSite(browser.back());
// of course you could cheat by invoking Optional.get() but that is a bad practice and the absence of object will be detected as soon as the invocation
browser.retrieveSite(browser.back().get());
}
public void retrieveSite(URL url) {
//...
}
Без Optional
, NPE возможен, если клиент забудет явно проверить отсутствие нуля (url != null
).Эта проверка действительно менее привлекательна для разработчика, чем вызов метода, который является обязательным для получения / отображения обернутого объекта.Кроме того, вы можете обнаружить ссылку null
позже в самом нижнем слое, если параметр url передан через слои, что делает проблемы потенциально более сложными для понимания и решения:
public static void main(String[] args) {
System.out.println("Normal back");
Browser browser = new Browser();
// No unwrapping is necessary to get the url.
// So the robustness of the code depends on the developer habits
browser.retrieveSite(browser.back());
}
public void retrieveSite(URL url) {
//...
}