英文:
Android Java: Convert else-if to switch
问题
我使用 else-if 语句来检查布尔值,由于使用 else-if,导致性能较差。
基于这个原因,我考虑将 else-if 语句转换为 switch 语句,所以我想听听您对适当转换的建议。
这是我的 else-if 语句
public class Config_Monday_0 {
// ...(此处省略了代码的其余部分)
public int monday_0(TextView mon_1, TextView mon_2, TextView mon_3, TextView mon_4, TextView mon_5,
TextView mon_6, TextView mon_7, TextView mon_8, TextView mon_9, TextView mon_10,
// ...(省略其他参数)
TextView mon_23, TextView mon_24){
Schedule_Boolean_Monday_0 schedule_boolean_monday0 = new Schedule_Boolean_Monday_0(mContext);
DatabaseTimetable databaseTimetable = new DatabaseTimetable(mContext);
int start_time;
int end_time;
switch (true) {
case !schedule_boolean_monday0.Monday_0_1() && !schedule_boolean_monday0.Monday_0_2() && /* ... */:
return 0;
case schedule_boolean_monday0.Monday_0_1() && !schedule_boolean_monday0.Monday_0_2() && /* ... */:
start_time = 0;
end_time = 1;
// ...(设置 mon_1 的属性)
return 1;
case !schedule_boolean_monday0.Monday_0_1() && schedule_boolean_monday0.Monday_0_2() && /* ... */:
start_time = 0;
end_time = 2;
// ...(设置 mon_1 和 mon_2 的属性)
return 2;
case !schedule_boolean_monday0.Monday_0_1() && !schedule_boolean_monday0.Monday_0_2() && /* ... */:
start_time = 0;
end_time = 3;
// ...(设置 mon_1、mon_2 和 mon_3 的属性)
return 3;
default:
return 99;
}
}
// ...(此处省略了代码的其余部分)
}
这是一个指示布尔变量的类
public class Schedule_Boolean_Monday_0 {
// ...(此处省略了代码的其余部分)
public Boolean Monday_0_1(){
// ...(此处省略了代码的其余部分)
}
public Boolean Monday_0_2(){
// ...(此处省略了代码的其余部分)
}
// ...(省略其他方法)
}
在上述代码中,我已经将原来的 if/else-if 结构转换为了 switch 结构,以便更好地处理布尔值的情况。请您在实际应用中进行测试并适当调整。
英文:
I use else-if statement to check Boolean values and since using the else-if, it causes poor performance.
> From that reason, I am considering to convert the else-if statement into switch statement, so that I'd like to hear your advice to converting it appropriately.
This is my else-if statement
public class Config_Monday_0 {
private Context mContext;
public Config_Monday_0(Context context){
this.mContext = context;
}
public int monday_0(TextView mon_1, TextView mon_2, TextView mon_3, TextView mon_4, TextView mon_5,
TextView mon_6, TextView mon_7, TextView mon_8, TextView mon_9, TextView mon_10,
TextView mon_11, TextView mon_12, TextView mon_13, TextView mon_14, TextView mon_15,
TextView mon_16, TextView mon_17, TextView mon_18, TextView mon_19, TextView mon_20,
TextView mon_21, TextView mon_22, TextView mon_23, TextView mon_24){
Schedule_Boolean_Monday_0 schedule_boolean_monday0 = new Schedule_Boolean_Monday_0(mContext);
DatabaseTimetable databaseTimetable = new DatabaseTimetable(mContext);
int start_time;
int end_time;
//Database 0 AM is not used
if (!schedule_boolean_monday0.Monday_0_1() && !schedule_boolean_monday0.Monday_0_2() && !schedule_boolean_monday0.Monday_0_3() && !schedule_boolean_monday0.Monday_0_4() && !schedule_boolean_monday0.Monday_0_5() &&
!schedule_boolean_monday0.Monday_0_6() && !schedule_boolean_monday0.Monday_0_7()&& !schedule_boolean_monday0.Monday_0_8() && !schedule_boolean_monday0.Monday_0_9() && !schedule_boolean_monday0.Monday_0_10() &&
!schedule_boolean_monday0.Monday_0_11() && !schedule_boolean_monday0.Monday_0_12() && !schedule_boolean_monday0.Monday_0_13() && !schedule_boolean_monday0.Monday_0_14() && !schedule_boolean_monday0.Monday_0_15() &&
!schedule_boolean_monday0.Monday_0_16() && !schedule_boolean_monday0.Monday_0_17()&& !schedule_boolean_monday0.Monday_0_18() && !schedule_boolean_monday0.Monday_0_19() && !schedule_boolean_monday0.Monday_0_20() &&
!schedule_boolean_monday0.Monday_0_21() && !schedule_boolean_monday0.Monday_0_22() && !schedule_boolean_monday0.Monday_0_23() && !schedule_boolean_monday0.Monday_0_24()){
return 0;
}
//0 am - 1 hr.
else if (schedule_boolean_monday0.Monday_0_1() && !schedule_boolean_monday0.Monday_0_2() && !schedule_boolean_monday0.Monday_0_3() && !schedule_boolean_monday0.Monday_0_4() && !schedule_boolean_monday0.Monday_0_5() &&
!schedule_boolean_monday0.Monday_0_6() && !schedule_boolean_monday0.Monday_0_7()&& !schedule_boolean_monday0.Monday_0_8() && !schedule_boolean_monday0.Monday_0_9() && !schedule_boolean_monday0.Monday_0_10() &&
!schedule_boolean_monday0.Monday_0_11() && !schedule_boolean_monday0.Monday_0_12() && !schedule_boolean_monday0.Monday_0_13() && !schedule_boolean_monday0.Monday_0_14() && !schedule_boolean_monday0.Monday_0_15() &&
!schedule_boolean_monday0.Monday_0_16() && !schedule_boolean_monday0.Monday_0_17()&& !schedule_boolean_monday0.Monday_0_18() && !schedule_boolean_monday0.Monday_0_19() && !schedule_boolean_monday0.Monday_0_20() &&
!schedule_boolean_monday0.Monday_0_21() && !schedule_boolean_monday0.Monday_0_22() && !schedule_boolean_monday0.Monday_0_23() && !schedule_boolean_monday0.Monday_0_24()){
start_time = 0;
end_time = 1;
schedule_boolean_monday0.Monday_0_1();
mon_1.setText(databaseTimetable.Monday_Title(start_time, end_time));
mon_1.setTextColor(Color.parseColor(databaseTimetable.Monday_Text_Color(start_time, end_time)));
mon_1.setBackgroundColor(Color.parseColor(databaseTimetable.Monday_Text_BG_Color(start_time, end_time)));
return 1;
}
//0 am - 2 hr.
else if (!schedule_boolean_monday0.Monday_0_1() && schedule_boolean_monday0.Monday_0_2() && !schedule_boolean_monday0.Monday_0_3() && !schedule_boolean_monday0.Monday_0_4() && !schedule_boolean_monday0.Monday_0_5() &&
!schedule_boolean_monday0.Monday_0_6() && !schedule_boolean_monday0.Monday_0_7()&& !schedule_boolean_monday0.Monday_0_8() && !schedule_boolean_monday0.Monday_0_9() && !schedule_boolean_monday0.Monday_0_10() &&
!schedule_boolean_monday0.Monday_0_11() && !schedule_boolean_monday0.Monday_0_12() && !schedule_boolean_monday0.Monday_0_13() && !schedule_boolean_monday0.Monday_0_14() && !schedule_boolean_monday0.Monday_0_15() &&
!schedule_boolean_monday0.Monday_0_16() && !schedule_boolean_monday0.Monday_0_17()&& !schedule_boolean_monday0.Monday_0_18() && !schedule_boolean_monday0.Monday_0_19() && !schedule_boolean_monday0.Monday_0_20() &&
!schedule_boolean_monday0.Monday_0_21() && !schedule_boolean_monday0.Monday_0_22() && !schedule_boolean_monday0.Monday_0_23() && !schedule_boolean_monday0.Monday_0_24()){
start_time = 0;
end_time = 2;
schedule_boolean_monday0.Monday_0_2();
mon_1.setText(databaseTimetable.Monday_Title(start_time, end_time));
mon_1.setTextColor(Color.parseColor(databaseTimetable.Monday_Text_Color(start_time, end_time)));
mon_1.setBackgroundColor(Color.parseColor(databaseTimetable.Monday_Text_BG_Color(start_time, end_time)));
mon_2.setBackgroundColor(Color.parseColor(databaseTimetable.Monday_Text_BG_Color(start_time, end_time)));
return 2;
}
//0 am - 3 hr.
else if (!schedule_boolean_monday0.Monday_0_1() && !schedule_boolean_monday0.Monday_0_2() && schedule_boolean_monday0.Monday_0_3() && !schedule_boolean_monday0.Monday_0_4() && !schedule_boolean_monday0.Monday_0_5() &&
!schedule_boolean_monday0.Monday_0_6() && !schedule_boolean_monday0.Monday_0_7()&& !schedule_boolean_monday0.Monday_0_8() && !schedule_boolean_monday0.Monday_0_9() && !schedule_boolean_monday0.Monday_0_10() &&
!schedule_boolean_monday0.Monday_0_11() && !schedule_boolean_monday0.Monday_0_12() && !schedule_boolean_monday0.Monday_0_13() && !schedule_boolean_monday0.Monday_0_14() && !schedule_boolean_monday0.Monday_0_15() &&
!schedule_boolean_monday0.Monday_0_16() && !schedule_boolean_monday0.Monday_0_17()&& !schedule_boolean_monday0.Monday_0_18() && !schedule_boolean_monday0.Monday_0_19() && !schedule_boolean_monday0.Monday_0_20() &&
!schedule_boolean_monday0.Monday_0_21() && !schedule_boolean_monday0.Monday_0_22() && !schedule_boolean_monday0.Monday_0_23() && !schedule_boolean_monday0.Monday_0_24()){
start_time = 0;
end_time = 3;
schedule_boolean_monday0.Monday_0_3();
mon_1.setText(databaseTimetable.Monday_Title(start_time, end_time));
mon_1.setTextColor(Color.parseColor(databaseTimetable.Monday_Text_Color(start_time, end_time)));
mon_1.setBackgroundColor(Color.parseColor(databaseTimetable.Monday_Text_BG_Color(start_time, end_time)));
mon_2.setBackgroundColor(Color.parseColor(databaseTimetable.Monday_Text_BG_Color(start_time, end_time)));
mon_3.setBackgroundColor(Color.parseColor(databaseTimetable.Monday_Text_BG_Color(start_time, end_time)));
return 3;
}
return 99;
}
}
> This is a class that indicates Boolean variables
public class Schedule_Boolean_Monday_0 {
private Context mContext;
private DatabaseTimetable databaseTimetable;
public Schedule_Boolean_Monday_0(Context context){
this.mContext = context;
}
public Boolean Monday_0_1(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,1);
return !result.equals("");
}
public Boolean Monday_0_2(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,2);
return !result.equals("");
}
public Boolean Monday_0_3(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,3);
return !result.equals("");
}
public Boolean Monday_0_4(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,4);
return !result.equals("");
}
public Boolean Monday_0_5(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,5);
return !result.equals("");
}
public Boolean Monday_0_6(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,6);
return !result.equals("");
}
public Boolean Monday_0_7(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,7);
return !result.equals("");
}
public Boolean Monday_0_8(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,8);
return !result.equals("");
}
public Boolean Monday_0_9(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,9);
return !result.equals("");
}
public Boolean Monday_0_10(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,10);
return !result.equals("");
}
public Boolean Monday_0_11(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,11);
return !result.equals("");
}
public Boolean Monday_0_12(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,12);
return !result.equals("");
}
public Boolean Monday_0_13(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,13);
return !result.equals("");
}
public Boolean Monday_0_14(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,14);
return !result.equals("");
}
public Boolean Monday_0_15(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,15);
return !result.equals("");
}
public Boolean Monday_0_16(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,16);
return !result.equals("");
}
public Boolean Monday_0_17(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,17);
return !result.equals("");
}
public Boolean Monday_0_18(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,18);
return !result.equals("");
}
public Boolean Monday_0_19(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,19);
return !result.equals("");
}
public Boolean Monday_0_20(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,20);
return !result.equals("");
}
public Boolean Monday_0_21(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,21);
return !result.equals("");
}
public Boolean Monday_0_22(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,22);
return !result.equals("");
}
public Boolean Monday_0_23(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,23);
return !result.equals("");
}
public Boolean Monday_0_24(){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,0);
return !result.equals("");
}
}
> There are 24 Boolean variables in each if/else-if arguments. I thought converting to switch methods might lead better performance for my app and if you have any ideas, I'd like to hear your advice.
答案1
得分: 0
你的问题不在于 if
语句,if
语句已经尽可能高效了。你的问题在于每次访问变量时都要访问数据库,这才是你应该处理的。
如果我是你,我会一次性读取所有布尔变量,然后使用这些值来实现你尝试实现的任何逻辑。主要观点是,读取一次并尽可能缓存所有内容
。
英文:
Your problem is not the if
statement, if
statements are as efficient as they can get. Your problem is accessing the database for every variable access, and this is what you should deal with.
If I were you, I'd read all boolean variables once and then used those values to implement whatever logic you're trying to implement. The main point being, READ ONCE AND CACHE ALL YOU CAN
.
答案2
得分: 0
写好代码的核心原则之一是避免重复代码。在你的情况下,我认为尝试遵循这个原则可能会有所帮助。
在Lenik的回答基础上,我认为你最好是首先将整个if
语句包含在一个检查中,该检查首先检查Monday_0_4
到Monday_0_24
。类似于这样:
if (!schedule_boolean_monday0.Monday_0_4() && !schedule_boolean_monday0.Monday_0_5() &&
!schedule_boolean_monday0.Monday_0_6() && !schedule_boolean_monday0.Monday_0_7() &&
!schedule_boolean_monday0.Monday_0_8() && !schedule_boolean_monday0.Monday_0_9() &&
!schedule_boolean_monday0.Monday_0_10() && !schedule_boolean_monday0.Monday_0_11() &&
!schedule_boolean_monday0.Monday_0_12() && !schedule_boolean_monday0.Monday_0_13() &&
!schedule_boolean_monday0.Monday_0_14() && !schedule_boolean_monday0.Monday_0_15() &&
!schedule_boolean_monday0.Monday_0_16() && !schedule_boolean_monday0.Monday_0_17() &&
!schedule_boolean_monday0.Monday_0_18() && !schedule_boolean_monday0.Monday_0_19() &&
!schedule_boolean_monday0.Monday_0_20() && !schedule_boolean_monday0.Monday_0_21() &&
!schedule_boolean_monday0.Monday_0_22() && !schedule_boolean_monday0.Monday_0_23() &&
!schedule_boolean_monday0.Monday_0_24()) {
// 在这里放置你现有的if语句,但是将对Monday_0_4到Monday_0_24的检查从每个条件中移除
}
其次,仅为了代码更加优雅,同时也考虑到我可能没有完全理解你的代码,我认为你最好将数据库检查重新设计如下:
public Boolean Monday_0(int hour) {
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0, hour);
return !result.equals("");
}
你还可以进一步简化你的代码:
- 在你的if语句之外放置一个返回值,返回
end_time
。end_time
应该初始化为 -1,这将同时作为“错误”返回值(而不是99)。 - 将下面这些也移到if之外,因为无论哪个条件为真,它们都会被调用:(你需要另一个嵌套的if来确保在Monday_0_1为假时不被调用)
mon_1.setText(databaseTimetable.Monday_Title(start_time, end_time));
mon_1.setTextColor(Color.parseColor(databaseTimetable.Monday_Text_Color(start_time, end_time)));
mon_1.setBackgroundColor(Color.parseColor(databaseTimetable.Monday_Text_BG_Color(start_time, end_time)));
- 使用
for
循环进行检查,使用我前面提到的改进的数据库检查方法
希望对你有所帮助!
英文:
One of the core principles of writing good code is avoiding repetition. In your case, I think trying to adhere to this principle might help.
To expand on Lenik's answer, I think you would be best to first enclose your entire if
statement in a check that first checks Monday_0_4
through Monday_0_24
. Something like this:
if( !schedule_boolean_monday0.Monday_0_4() && !schedule_boolean_monday0.Monday_0_5() &&
!schedule_boolean_monday0.Monday_0_6() && !schedule_boolean_monday0.Monday_0_7()&&
!schedule_boolean_monday0.Monday_0_8() && !schedule_boolean_monday0.Monday_0_9() &&
!schedule_boolean_monday0.Monday_0_10() && !schedule_boolean_monday0.Monday_0_11() &&
!schedule_boolean_monday0.Monday_0_12() && !schedule_boolean_monday0.Monday_0_13() &&
!schedule_boolean_monday0.Monday_0_14() && !schedule_boolean_monday0.Monday_0_15() &&
!schedule_boolean_monday0.Monday_0_16() && !schedule_boolean_monday0.Monday_0_17()&&
!schedule_boolean_monday0.Monday_0_18() && !schedule_boolean_monday0.Monday_0_19() &&
!schedule_boolean_monday0.Monday_0_20() && !schedule_boolean_monday0.Monday_0_21() &&
!schedule_boolean_monday0.Monday_0_22() && !schedule_boolean_monday0.Monday_0_23() &&
!schedule_boolean_monday0.Monday_0_24() ) {
//your existing if statement here, but with the checks for Monday_0_4 through Monday_0_24 removed from each one
}
Secondly, just for the sake of nicer code, and bearing in mind I might not fully understand your code, I think you might be best redesigning your database check to the following:
public Boolean Monday_0(int hour){
databaseTimetable = new DatabaseTimetable(mContext);
String result = databaseTimetable.Monday_Title(0,hour);
return !result.equals("");
}
You could also further simplify your code by:
- Putting one return value
outside
your if statements, returningend_time
.end_time
should be initialised to -1, which would double as the "error" return value (instead of 99). - Moving these outside the if too, because they're called no matter which condition is true: (you'd need another nested if to make sure it's not called when Monday_0_1 is false)
mon_1.setText(databaseTimetable.Monday_Title(start_time, end_time));
mon_1.setTextColor(Color.parseColor(databaseTimetable.Monday_Text_Color(start_time, end_time)));
mon_1.setBackgroundColor(Color.parseColor(databaseTimetable.Monday_Text_BG_Color(start_time, end_time)));
- Performing your checks with a
for
loop, using the improved database check I mentioned earlier
Hope this helps!
专注分享java语言的经验与见解,让所有开发者获益!
评论