假设我有一个List<SomeObject>,并且有一个函数可以返回该对象引用。
SomeObject GetSomeObject(List<SomeObject>, int x){
/* Search for object in list that has a properties
with value x */
if (found)
return /* The object found */
else
return NULL;
}
void DoSomething(SomeObject S){
if(S!=NULL){
/* Do action 1 */
}
else{
/* Do action 2 */
}
}我在某处读到过返回NULL不是干净代码的一部分。所以我想知道这个例子的等效代码是什么。
更新:我读过this question,我觉得我的情况有所不同。在这种情况下,如果返回NULL,则不执行任何操作,而如果返回NULL,则需要执行一些操作
发布于 2015-04-28 19:24:39
如果您使用的是Java8,请考虑Optional类,但请注意,它并不适用于所有地方。
许多人认为(包括我在内) Optional应该只用于返回值,而不是参数,尤其是不能用于对象属性。然而,像往常一样,没有硬规则,只是要小心,不要盲目地用Optional代替null处理,而不知道你是否从中获得了任何好处。
例如,在示例代码中,Optional不会给您带来任何好处。由于无论是否为if(s.isPresent())都要执行一些操作,因此只需将if(s == null)更改为null即可。但是,如果逻辑只有在s不为空的情况下才执行某些操作,那么在没有else的情况下,您可以使用Optional.ifPresent()来使事情变得更清晰一些。当然,Optional中还有其他有用的方法可以让您获得更干净的代码,比如orElse(),它可以有效地用于使用默认值。
发布于 2015-04-28 20:09:07
看起来您指的是special case模式(特定的实现是Option或Null Object模式)。
在Java 8和Guava库中有名为Optional的Option类型的Java实现。
在您的示例中,您将使用Optional<SomeObject>并拥有此实现(我使用的是Guava实现):
Optional<SomeObject> getSomeObject(List<SomeObject>, int x) {
/* Search for object in list that has a properties
with value x */
if (found) {
return Optional.of(objectFound);
} else {
return Optional.absent(); // or Optional.empty(); in Java 8
}
// if objectFound variable is null when not found, you can simply use
// return Optional.fromNullable(objectFound);
// or return Optional.ofNullable(objectFound); in Java 8
}因此,返回一个可选对象的代码是自解释的。然后,您将拥有:
void doSomething(Optional<SomeObject> o) {
if (o.isPresent()) {
SomeObject someObject = o.get();
/* Do action 1 */
} else {
/* Do action 2 */
}
// or opt.map(/* action 1 */).orElse(/* action 2 */); in Java 8
}发布于 2015-04-28 19:24:50
您可以抛出NoSuchElementException,这与"fail fast"的方法很好地结合在一起。
然而,,如果你的代码开始使用流控制的异常机制-这是一个非常大的禁忌,你应该避免它。
一个很好的经验法则是,只有当你的API也支持contains() (或HasSomeObject(obj))方法时,如果元素不存在,就抛出一个异常。
免责声明:这个答案适用于java-8之前的代码,对于java8,更好的实践可能是可选的,as suggested by @Kayman
https://stackoverflow.com/questions/29918073
复制相似问题