当我们讨论完了Java的变量常量,便要开始讨论语句了,顺序语句自然不用介绍,那么先从条件语句开始介绍吧
IF-ELSE
- 简单的IF
if(条件判断){ 条件为true时执行的语句 }
- 有点复杂的IF-ELSE
if(条件判断){ 条件为true时执行的语句 }else{ 条件为false时执行的语句 }
- 更复杂的IF-ELSE IF-ELSE
if(条件判断){ 条件为true时执行的语句 }else if(条件判断2){ 条件2为true时执行的语句 }else{ 条件2为false时执行的语句 }
三目运算符
- 针对这种复杂的IF-ELSE结构,有一种简便的运算方法,即三目运算符。a条件判断?true则a=c:false则有a=d,举个🌰。
当a大于0的时候a=1,否则a=2,这样子是不是方便了很多呢。a>0:1:2;
Swtich
- Switch case结构能够清晰的展示所有条件,但是case后只能跟常量,不能对变量进行判定。
switch(){ case 1: case 2: }
简化复杂的IF-ELSE判断
-
条件表达式通常有两种表现形式。第一种:所有分支都是属于正常行为。第二种:条件表达式提供的答案只有一种是正常行为,其他都是不常见的情况。
第一种,需要使用if-else。
第二种,不常见的情况,单独检查该条件。if(isDead){ }else if(isStart){ }else if(isEnd){ }
上方代码可以转为
if(isDead){} if(isStart){} if(isEnd){}
-
在条件表达式的每个分支上有着相同的一段逻辑代码。
if(isSpecial){ total=price*2; send(); }else { total=price*3; send(); }
上述代码可以转化为:
if(isSpecial){ total=price*2; }else { total=price*3; } send();
-
如果分支逻辑过于复杂,可以将逻辑抽取出来作为一个方法,这样更加清晰一些。
if(isStart){ a=a*b*c; a=a*d; }else{ a=a+b+c; a=a+d; }
可以优化成
if(isStart){ multi(); }else{ add(); } public void multi(){ a=a*b*c; a=a*d; } public void add(){ a=a+b+c; a=a+d; }
-
合并条件表达式,如果有一系列的判断条件,得到相同的结果,那么可以将这些条件嵌套成一个条件表达式,甚至可以将合并的表达式抽取出一个独立的函数。
if(isStarted){ return 0; }else if(isEnded){ return 0; }else if(isNoted){ return 0; }
第一次优化,将结果相同的条件优化成一个条件表达式
if(isStarted||isEnded||isNoted){ return 0; }
第二次优化,将条件表达式抽出一个函数
if(isMore()){ return 0; } public boolean isMore(){ return isStarted||isEnded||isNoted; }
-
去除Else的方法
-
如果程序中只有一个else,使用return 来处理
if(con){ doOne(); }else{ doTwo(); }
使用return 拒绝else
if(con){ doOne(); return; } doTwo();
或者直接使用三元运算符:con?doOne():doTwo();
-
如果程序中有多个else ,可以使用策略模式来替换。
if(con){ doThing1(); }else if(con2){ doThing2(); }else if(con3){ doThing3(); }
使用策略模式或者多态来拒绝else。关于策略模式可以看《每天一点Java知识》设计模式——策略模式
举个🌰:public Class Context{ Con con; public void Context(Con con){ this.con=con; } public void doThing(){ con.doThing(); } } public interface Con{ public void doThing(); } public Class Con1{ public void doThing(){ doThing1(); } } public Class Con2{ public void doThing(){ doThing2(); } } public Class Con3{ public void doThing(){ doThing3(); } }
-