предисловие
С итерацией проекта в коде может быть все больше и больше оценок ветвей Когда задействованная логика сложна или количество ветвей слишком велико для обслуживания, мы должны рассмотреть, есть ли способы сделать это. более элегантный?
текст
использовать перечисление
Здесь мы просто определяем перечисление, представляющее состояние.
public enum Status {
NEW(0),RUNNABLE(1),RUNNING(2),BLOCKED(3),DEAD(4);
public int statusCode;
Status(int statusCode){
this.statusCode = statusCode;
}
}
Затем мы можем вызвать его напрямую через перечисление, когда мы его используем.
int statusCode = Status.valueOf("NEW").statusCode;
Элегантно решает назначение следующего кода
if(param.equals("NEW")){
statusCode = 0;
}else if(param.equals("RUNNABLE")){
statusCode = 1;
}
...
Эффективно используйте необязательный
В проекте всегда есть какие-то непустые суждения, и большинство людей все еще могут использовать следующие
if(null == user){
//action1
}else{
//action2
}
В настоящее время пришло время вынуть секретное оружие Факультатива, которое может сделать ненулевую проверку более элегантной и косвенно сократить количество операций. Учащиеся, не знакомые с Факультативом, могут самостоятельно найти его в Google, поэтому я не буду вдаваться в подробности.
Optional<User> userOptional = Optional.ofNullable(user);
userOptional.map(action1).orElse(action2);
Приведенный выше код эквивалентен первому абзацу с некоторыми новыми функциями, которые делают код более компактным.
табличный подход
Пояснение от Google: табличный метод — это модель программирования, суть которой заключается в запросе информации из таблиц вместо логических операторов (if, case). Давайте рассмотрим случай, когда количество дней в текущем месяце получается по месяцам (только для примера, данные, полученные в феврале, не являются строгими), обычная практика:
int getMonthDays(int month){
switch(month){
case 1:return 31;break;
case 2:return 29;break;
case 3:return 31;break;
case 4:return 30;break;
case 5:return 31;break;
case 6:return 30;break;
case 7:return 31;break;
case 8:return 31;break;
case 9:return 30;break;
case 10:return 31;break;
case 11:return 30;break;
case 12:return 31;break;
default:return 0;
}
}
табличный подход
int monthDays[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int getMonthDays(int month){
return monthDays[--month];
}
По сути, таблица здесь — это просто массив, а необходимые данные можно получить прямым запросом к массиву, точно так же и контейнер, такой как Map, тоже может стать таблицей в нашей концепции программирования.
Map<?, Function<?> action> actionsMap = new HashMap<>();
// 初试配置对应动作
actionsMap.put(value1, (someParams) -> { doAction1(someParams)});
actionsMap.put(value2, (someParams) -> { doAction2(someParams)});
actionsMap.put(value3, (someParams) -> { doAction3(someParams)});
// 省略 null 判断
actionsMap.get(param).apply(someParams);
С помощью лямбда-выражения Java8 мы сохраняем вещи, которые необходимо выполнить, в значении и вызываем его, сопоставляя ключ.
вернуться заранее
Это также упоминалось в предыдущей статье «Дурной запах при оптимизации кода», следующее утверждение
if(condition){
//dost
}else{
return ;
}
изменить на
if(!condition){
return ;
}
//dost
Избегайте ненужных ветвей и делайте код более совершенным.
Другие методы
В дополнение к методам, упомянутым выше, мы также можем использовать некоторые шаблоны проектирования, такие как шаблон стратегии, шаблон цепочки ответственности и т. д., чтобы оптимизировать ситуацию, когда существует большое количество случаев и случаев.Принцип будет аналогичен Табличный паттерн.Вы можете реализовать его самостоятельно.Например, при использовании Netty могут возникать сценарии, требующие оценки большого количества различных команд для выполнения соответствующих действий.
ServerHandler.java
if(command.equals("login")){
//执行登录
}else if(command.equals("chat")){
//聊天
}else if(command.equals("broadcast")){
//广播信息
}
....
Как с этим бороться? Давайте сначала продадим его здесь. Вы можете подумать об этом в первую очередь. В будущем я напишу несколько статей о реализации Netty IM, и я подробно расскажу об этом в то время.
Эпилог
Наконец, должно быть ясно, что не все if/else, switch/case нуждаются в оптимизации. в противном случае вы можете написать масштабируемый код, который никогда не масштабируется, все оптимизации предназначены для улучшения итерационных проектов и лучшего обслуживания бизнеса, а не ради оптимизации.
Сообщение в блоге публичного аккаунта синхронизировано с репозиторием Github. Заинтересованные друзья могут помочь дать звезду. Кодировать слова непросто. Спасибо за вашу поддержку.
Рекомендуемое чтение
"Как повысить эффективность использования отражения Java?》
"Журнал Java правильное использование позы》
"Народный язык понимает, что такое синхронный/асинхронный/блокирующий/неблокирующий》
"О нескольких позах и способах самоспасения при взрыве JVM》
Обратите внимание на «Программу обезьяны посреди ночи» и поделитесь лучшими галантерейными товарами