2016-08-23 29 views
3

我想了一个对象的一些代码优化和我目前唯一标题验证返回时的Java跳过空物体看起来是这样的:用.equals()

public boolean validateTitle(RawProfileConstraint rawProfileConstraint) { 
    RawProfileConstraint result = profileConstraintMapper.validateTitle(rawProfileConstraint.getTitle()); 
    return (!rawProfileConstraint.getTitle().equals(result.getTitle())); 
} 

这工作,直到它抛出一个在那里发脾气数据库无法检索包含我试图验证的标题的记录 - 也就是说它可用。在那种情况下,result将是null。 在这种情况下,我如何在null中加入处理程序,而不需要您常用的if-else

+2

为什么 “没有你平时'如果-else'”? –

+0

三元条件?:P – AxelH

+1

提示:你的命名很混乱。你的“mapper”上的validateTitle方法返回一个RawProfileConstraint对象;您显示的validateTitle方法返回布尔值。这至少不一致!在我看来,验证方法应该是无效的,并为无效输入引发异常;或者你会返回一些带有有意义信息的“真实对象”。只是返回true/false;这几乎就像1995年的C编程风格。含义:考虑重命名你的方法;认为他们“以同样的方式工作”。 – GhostCat

回答

5

简单的检查,如果result是提领前空:

return result != null 
    && !rawProfileConstraint.getTitle().equals(result.getTitle()); 

return result == null 
    || !rawProfileConstraint.getTitle().equals(result.getTitle()); 

取决于你想要得到的结果是(分别为falsetrue)时result == null什么。

&&||短路,所以他们不会评价,除非必要的右手操作数:

  • false && anything == false,所以没有必要评价anything
  • true || anything == true,所以没有必要评估anything
+0

感谢您的帮助。我过度思考,因为我无法正确地看到整体画面和其他事物。谢谢安迪和ghostcat。 – Kei

1

一个选项,以避免检查null是使用Optional(我F你使用的是Java 8):

更换

result.getTitle() 

Optional.ofNullable(result).map(RawProfileConstraint::getTitle).orElse("") 
0

我会建议退一步。你为什么认为使用if/else是一个坏主意?

你真的认为像

public boolean validateTitle(RawProfileConstraint rawProfileConstraint) { 
RawProfileConstraint result = profileConstraintMapper.validateTitle(rawProfileConstraint.getTitle()); 
if (result == null) { 
    return false; 

return (!rawProfileConstraint.getTitle().equals(result.getTitle())); 

解决这么多的“难”不是用回归和& &为AndyT仔细阅读?或者Eran提出的“一个表达式中流利的表述”?!

此外:使用如果像那样...也清楚地表明你的验证方法有一个概念上的问题。看起来有点奇怪,空结果应该导致错误(或者真)。

长话短说:如果您退后一步,重新考虑您在内部使用的用于验证调用的“接口”,我认为您的代码将获得最大收益。

0

Ternary operator可能是有用的:

return reusult!=null?(!rawProfileConstraint.getTitle().equals(result.getTitle())):false; 
+0

'a? b:如果'b'是布尔类型,'false'就是'a && b'。不需要三元操作员。 –

+0

谢谢@AndyTurner的建议 –