Java 编写干净的if else语句
使用if else链有些时候看起来比较复杂,这可以通过将代码写成小块来避免。使用条件语句可以增加代码的可读性和更多。一个最好的做法是首先处理错误的情况。下面的例子显示了如何处理错误情况和简化if else逻辑。
例子1:
updateCache()–这是一个方法,在一些类级变量的基础上决定更新主数据库。
updateBackupDb()–这是一个更新数据库的方法。
使用这种类型的if else很难调试和扩展现有函数的任何功能。
优化前
// A simple method handling the data
// base operation related task
private void updateDb(boolean isForceUpdate) {
// isUpdateReady is class level
// variable
if (isUpdateReady) {
// isForceUpdate is argument variable
// and based on this inner blocks is
// executed
if (isForceUpdate) {
// isSynchCompleted is also class
// level variable, based on its
// true/false updateDbMain is called
// here updateBackupDb is called
// in both the cases
if (isSynchCompleted) {
updateDbMain(true);
updateBackupDb(true);
} else {
updateDbMain(false);
updateBackupDb(true);
}
} else {
// execute this if isUpdateReady is
// false i. e., this is dependent on
// if condition
updateCache(!isCacheEnabled);
// end of second isForceUpdate block
}
// end of first if block
}
// end of method
}
观察:
在下面的代码中,布尔变量已经被确定,在此基础上 ,使用if和return语句将代码分成小块。
1.如果更新没有准备好,那么不需要进入方法 ,只需要从这个方法中退出。
2.同样,如果强制更新的布尔值是假的,那么在if语句中执行任务 - 更新缓存并从这个方法返回。
3.在最后一步,剩下的所有任务都完成了,更新备份数据库和更新主数据库。
优化后
// A simple method handling the
// data base operation related
// task
private void updateDb(boolean isForceUpdate) {
// If isUpdateReaday boolean is not
// true then return from this method,
// nothing was done in else block
if (!isUpdateReady)
return;
// Now if isForceUpdate boolean is
// not true then only updating the
// cache otherwise this block was
// not called
if (!isForceUpdate) {
updateCache(!isCacheEnabled);
return;
}
// After all above condition is not
// fulfilled below code is executed
// this backup method was called two
// times thus calling only single time
updateBackupDb(true);
// main db is updated based on sync
// completed method
updateDbMain(isSynchCompleted ? true : false);
}
这种简单的代码块的好处是–对于下一个开发者来说,非常容易调试/理解/扩展这种方法。
例2:
通过现有的JAVA API代码例子来解释这个想法
这个代码片段取自Java文档:-
JDK子字符串代码 JAVA API
上述API的现有代码–这个写的很完美
优化后
public String substring(int beginIndex, int endIndex) {
// My comment - Below are the example of
// correct use of if else, checking
// condition and returning from // methods,
// this is not about throwing error ie
// return or throw error or do something
// else - the idea is braking if // else
// chaining.
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length))
? this
: new String(value, beginIndex, subLen);
}
如果有人在修改上述逻辑后使用下面例子中的if else,会非常复杂,但最后会产生相同的结果,所以我不喜欢如下所示的实现方式 –
优化前
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
} else {
// Again why this else block is used,
// this need not to write, see above
// correct implementation
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
} else {
// This else is also not required
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
}
return ((beginIndex == 0) && (endIndex == value.length))
? this
: new String(value, beginIndex, subLen);
}
}
在看到以上两个例子后,我们可以观察到,错误处理是在进入方法的时候进行的。这是一个很好的做法,首先处理错误情况。
总的来说,如果可以根据要求在小块中使用其他的东西,这将消除代码的复杂性,代码将易于使用/调试/维护/扩展。