Как заменить многие операторы if в java?

Я пытаюсь сделать свой код "чище". У меня много функций с большим количеством операторов if. Как я могу заменить их?

Я использую 4 разных Hashtables, поэтому у меня есть эти ifs. Единственное, что меняется, — это имя хеш-таблицы и список jList, в который я добавляю информацию.

if (n.getCategorie().getNum() == Categorie.INTERNATIONAL.getNum())
                {
                    DefaultListModel dlm = (DefaultListModel) jListInternationales.getModel();
                    dlm.addElement(n.getTitre());
                    jListInternationales.setModel(dlm);
                    NewsInter.put(""+nNews, n);
                }
                else if (n.getCategorie().getNum() == Categorie.POLITIQUE.getNum())
                {
                    DefaultListModel dlm = (DefaultListModel) jListViePolitique.getModel();
                    dlm.addElement(n.getTitre());
                    jListViePolitique.setModel(dlm);
            NewsPolitique.put(""+nNews, n);
                }
                else if (n.getCategorie().getNum() == Categorie.RAGOT.getNum())
                {
                    DefaultListModel dlm = (DefaultListModel) jListRagotsEtPotins.getModel();
                    dlm.addElement(n.getTitre());
                    jListRagotsEtPotins.setModel(dlm);
            NewsRagot.put(""+nNews, n);
                }
                else if (n.getCategorie().getNum() == Categorie.SPORT.getNum())
                {
                    DefaultListModel dlm = (DefaultListModel) jListInfosSports.getModel();
                    dlm.addElement(n.getTitre());
                    jListInfosSports.setModel(dlm);
            NewsSport.put(""+nNews, n);
                }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
173
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете заменить структуру if, else if, else if, ..., изменив ее на структуру switch(), она выглядит так:

switch(n.getCategorie().getNum()){
    case Categorie.INTERNATIONAL.getNum():
        DefaultListModel dlm = (DefaultListModel) jListInternationales.getModel();
        dlm.addElement(n.getTitre());
        jListInternationales.setModel(dlm);
        NewsInter.put(""+nNews, n);

        break;
    case Categorie.POLITIQUE.getNum():
        ...etc
}

Кажется, вы используете перечисления. Перечисления можно сравнивать по экземпляру. Проверка номеров не требуется.

Их можно использовать в корпусе переключателя. Например.

switch (n.getCategorie()) {
case Categorie.INTERNATIONAL:
...

Это устраняет некоторый беспорядок, но не количество операторов if.

в вашем случае вы можете заменить его оператором Switch.

Это структура:

switch(value) {
  case x:
    // code block
    break;
  case y:
    // code block
    break;
  default:
    // code block
}

В вашей конкретной проблеме это будет:

switch(n.getCategorie()) {
  case International:
    // your code
    break;
  case Politique:
    // code block
    break;
...

  default:
    // code block
}
Ответ принят как подходящий

Единственная разница между ветвями if заключается в ссылке JList. Поскольку код повторяется, вы должны извлечь его в отдельный метод:

private void updateList(JList list) {
  DefaultListModel dlm = (DefaultListModel) list.getModel();
  dlm.addElement(n.getTitre());
  list.setModel(dlm);
}

После этого код становится намного чище:

if (n.getCategorie().getNum() == Categorie.INTERNATIONAL.getNum()) {
  updateList(jListInternationales);
} else if (n.getCategorie().getNum() == Categorie.POLITIQUE.getNum()) {
  updateList(jListViePolitique);
} // etc

NewsInter.put(""+nNews, n);

Спасибо за ваш ответ, но HashTable тоже меняется. Я думаю, что добавление еще одного параметра с хеш-таблицей может быть хорошим.

Kazh 03.06.2019 16:25

@Каж, наверное, да, однако NewsInter.put(""+nNews, n); можно вообще извлечь из if, поскольку он повторяется в каждой ветке if.

Karol Dowbecki 03.06.2019 16:26

Спасибо за ваши ответы!

Kazh 03.06.2019 16:28

Используйте команду Switch Case, которая занимает меньше памяти при обработке

Другие вопросы по теме