Java 带有 2 个条件和公共代码的 if 语句
Java if statement with 2 conditions and common code
我有两个条件要检查,如果一个条件为真,我需要执行一些代码,如果另一个条件为真,我需要执行一些不同的代码.但是,如果either为真,那么除了具体的代码,我还需要进行一段通用的代码。
注意这两个条件只能有一个为真,不能同时为真。
所以,我可以通过 3 种方式做到这一点:
方法一
if (condition1 || condition2){
//common code here
commonCode();
moreCommonCode();
//Dig a bit deeper to see which one was true
if (condition1){
//Carry out some code here specific to condition1
specificToCondition1();
moreCondition1Stuff();
}
else {
//Carry out some code here specific to condition2
specificToCondition2();
moreCondition2Stuff();
}
}
方法二
if (condition1){
specificToCondition1();
moreCondition1Stuff();
}
else if (condition2){
specificToCondition2();
moreCondition2Stuff();
}
if (condition1 || condition2){
commonCode();
moreCommonCode();
}
方法三
if (condition1){
specificToCondition1();
moreCondition1Stuff();
commonCode();
moreCommonCode();
}
else if (condition2){
specificToCondition2();
moreCondition2Stuff();
commonCode();
moreCommonCode();
}
在方法一和方法二中,我需要检查两次条件
在方法 3 中,我必须复制通用代码。
我是否遗漏了什么,有没有办法做到这一点,我不必复制代码或检查两次条件?
方法4(公共部分使用私有方法)
所以除了调用公共方法之外,你没有代码重复。
if (condition1) {
specificToCondition1();
moreCondition1Stuff();
execCond1AndCond2Stuff();
}
else if (condition2) {
specificToCondition2();
moreCondition2Stuff();
execCond1AndCond2Stuff();
}
void execCond1AndCond2Stuff() {
commonCode();
moreCommonCode();
}
bolean isSet = false;
if (condition1){
specificToCondition1();
moreCondition1Stuff();
isSet = true;
} else if (condition2){
specificToCondition2();
moreCondition2Stuff();
isSet = true;
}
if(isSet) {
commonCode();
moreCommonCode();
}
您可以根据实际代码的样子使用继承。这是我的想法的一个例子。不过还有更多样板代码...
package com.Whosebug.condition;
public abstract class AbstractCase {
public void doLogic() {
// Some common logic
doSpecificLogic();
}
abstract void doSpecificLogic();
}
package com.Whosebug.condition;
public class CaseOne extends AbstractCase {
@Override
protected void doSpecificLogic() {
// Specific logic
}
}
package com.Whosebug.condition;
public class CaseTwo extends AbstractCase {
@Override
protected void doSpecificLogic() {
// Specific logic
}
}
package com.Whosebug.condition;
public class CaseFactory {
public static AbstractCase getCase(boolean caseOne) {
return caseOne ? new CaseOne() : new CaseTwo();
}
}
package com.Whosebug.condition;
public class Implementation {
public static void main(String... args) {
CaseFactory.getCase(true).doLogic();
}
}
我有两个条件要检查,如果一个条件为真,我需要执行一些代码,如果另一个条件为真,我需要执行一些不同的代码.但是,如果either为真,那么除了具体的代码,我还需要进行一段通用的代码。
注意这两个条件只能有一个为真,不能同时为真。
所以,我可以通过 3 种方式做到这一点:
方法一
if (condition1 || condition2){
//common code here
commonCode();
moreCommonCode();
//Dig a bit deeper to see which one was true
if (condition1){
//Carry out some code here specific to condition1
specificToCondition1();
moreCondition1Stuff();
}
else {
//Carry out some code here specific to condition2
specificToCondition2();
moreCondition2Stuff();
}
}
方法二
if (condition1){
specificToCondition1();
moreCondition1Stuff();
}
else if (condition2){
specificToCondition2();
moreCondition2Stuff();
}
if (condition1 || condition2){
commonCode();
moreCommonCode();
}
方法三
if (condition1){
specificToCondition1();
moreCondition1Stuff();
commonCode();
moreCommonCode();
}
else if (condition2){
specificToCondition2();
moreCondition2Stuff();
commonCode();
moreCommonCode();
}
在方法一和方法二中,我需要检查两次条件
在方法 3 中,我必须复制通用代码。
我是否遗漏了什么,有没有办法做到这一点,我不必复制代码或检查两次条件?
方法4(公共部分使用私有方法)
所以除了调用公共方法之外,你没有代码重复。
if (condition1) {
specificToCondition1();
moreCondition1Stuff();
execCond1AndCond2Stuff();
}
else if (condition2) {
specificToCondition2();
moreCondition2Stuff();
execCond1AndCond2Stuff();
}
void execCond1AndCond2Stuff() {
commonCode();
moreCommonCode();
}
bolean isSet = false;
if (condition1){
specificToCondition1();
moreCondition1Stuff();
isSet = true;
} else if (condition2){
specificToCondition2();
moreCondition2Stuff();
isSet = true;
}
if(isSet) {
commonCode();
moreCommonCode();
}
您可以根据实际代码的样子使用继承。这是我的想法的一个例子。不过还有更多样板代码...
package com.Whosebug.condition;
public abstract class AbstractCase {
public void doLogic() {
// Some common logic
doSpecificLogic();
}
abstract void doSpecificLogic();
}
package com.Whosebug.condition;
public class CaseOne extends AbstractCase {
@Override
protected void doSpecificLogic() {
// Specific logic
}
}
package com.Whosebug.condition;
public class CaseTwo extends AbstractCase {
@Override
protected void doSpecificLogic() {
// Specific logic
}
}
package com.Whosebug.condition;
public class CaseFactory {
public static AbstractCase getCase(boolean caseOne) {
return caseOne ? new CaseOne() : new CaseTwo();
}
}
package com.Whosebug.condition;
public class Implementation {
public static void main(String... args) {
CaseFactory.getCase(true).doLogic();
}
}