Java 调用对象方法的if语句是否修改对象?
我试图在我的对象上执行操作,但只有在某些事情是真实的情况下才这样做。我有几种方法是考虑“Actudio”方法,它们<强> do/s>一些试图修改对象并返回true / false的动作,如果可以执行这个动作。 示例1Java 调用对象方法的if语句是否修改对象?,java,c#,if-statement,methods,conditional,Java,C#,If Statement,Methods,Conditional,我试图在我的对象上执行操作,但只有在某些事情是真实的情况下才这样做。我有几种方法是考虑“Actudio”方法,它们 do/s>一些试图修改对象并返回true / false的动作,如果可以执行这个动作。 示例1 Thing thing = new Thing(); if (thing.changeSomething()){ if (thing.shouldDoSomething()){ //do more things } } 我了解复合布尔表达式,喜欢检查数字
Thing thing = new Thing();
if (thing.changeSomething()){
if (thing.shouldDoSomething()){
//do more things
}
}
我了解复合布尔表达式,喜欢检查数字是否在有效值范围内
if(number>0 && number<=10)
//number is valid
例2与例1相同吗?示例2是否调用
shouldDoSomething()
方法?因为我不希望发生这种情况,因为有时候shouldDoSomething()
实际上还有其他含义&改变了对象的其他方面。调用
if (thing.changeSomething()){
if (thing.shouldDoSomething()){
本质上等同于
if (thing.changeSomething() && thing.shouldDoSomething()){
我猜它们被翻译成完全相同的IL
但是,如注释中所述,只有当第一个方法的计算结果为true时,才会执行第二个方法。如果&
-运算符的第一个操作数已经是false
,则无需同时执行第二个操作数,因此如果changeSomething
-方法allready返回false
,则不执行shouldDoSomething
-方法
顺便说一句,这适用于Java和C#。简单的答案是,这取决于thing.changeSomething()方法是否返回布尔值。如果不这样做,就会产生问题。很有可能定义这个方法来做一些事情,并在它完成它应该做的事情后返回true。在这种情况下,第二个示例将起作用
如果它不返回布尔值,您应该会看到一个错误,否则它可能无法正常工作
在示例2中,当以这种方式执行时,它应该调用该方法。我的建议是,因为您不希望创建getter()和checker()方法,您可以使用这些方法获取对象的信息,而无需对其进行更改。这也可以通过数据字段实现,具体取决于类结构
希望这是更容易消化和帮助 在Java中,逻辑AND运算符&&
是一个短路运算符,这意味着如果表达式的结果只能由左操作数确定,则不会计算右侧。具体地说,如果左侧的计算结果为false,则整个表达式为false,而不需要计算右侧来确定该值
在函数调用的情况下:
if ( thing.changeSomething() && (thing.shouldDoSomething() ){
//do more things
}
如果thing.changeSomething()
返回false,则不会调用thing.shouldDoSomething()
,因为无论此函数返回什么,表达式的计算结果都是false。因此,是的,上述内容相当于:
if ( thing.changeSomething() ) {
if (thing.shouldDoSomething() ){
//do more things
}
}
你说的是哪种语言?您标记了java和c#?我对java的了解还不足以说明它是否相同,但在C中,if(a&&b)
中的表达式b
仅在a
为true
时才进行计算。因此,示例2中的thing.shouldDoSomething()
只有在thing.changeSomething()
返回true
时才会被调用。我投票关闭这个问题,因为欺诈如果你打算基于对象的状态执行条件逻辑,您通常希望以一种不会首先更改状态的方式公开该状态。确定是否应该执行某项操作的方法不必更改其上下文对象的状态以确定是否需要执行该操作。我见过许多程序员在他们继承的代码中被这一点影响。这是一个应避免的反模式。的可能重复
if ( thing.changeSomething() ) {
if (thing.shouldDoSomething() ){
//do more things
}
}