Форум программистов, компьютерный форум, киберфорум
Java ME (J2ME)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 04.09.2017
Сообщений: 2

Не прописывать постоянно instanceof

04.09.2017, 22:54. Показов 4896. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Я только учусь.
Как упростить код, чтобы не прописывать постоянно instanceof?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 private void initList() {
       
 
        Hibernate hibernate = new HibernateCRUT();         
        list  = hibernate.read(str);
        
        tableModel = (DefaultTableModel) jTable1.getModel();        
        tableModel.setNumRows(0);
      
       
        for(Object obj : list)
        {
        if(obj instanceof DirectoryOrg)
        {
        tableModel.addRow(new Object[]{
        ((DirectoryOrg) obj).getId(),
        ((DirectoryOrg) obj).getName()
        });
        }else if(obj instanceof DirectoryBank)
        {
        tableModel.addRow(new Object[]{
        ((DirectoryBank) obj).getId(),
        ((DirectoryBank) obj).getName()
        });
     
        
        }
        }
   
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2017, 22:54
Ответы с готовыми решениями:

Оператор instanceof
Кто может объяснить, для чего нужен оператор instanceof? Как я понял, Используя оператор instanceof, можно узнать, от какого класса...

instanceof this.getClass();
public boolean add(Thing th) { Class cl=getClass(); if (th instanceof cl) { } Господа а...

instanceof error
Добавлено через 17 минут Почему получается ошибка, а не false public class SomeClass { int x = 16; public static...

3
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
05.09.2017, 19:06
Лучший ответ Сообщение было отмечено Даша9 как решение

Решение

Interface Directory
Кликните здесь для просмотра всего текста
JSON
1
2
3
4
5
public interface Directory {
    String getId();
    String getName();
 
}

Class DirectoryOrg
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
public class DirectoryOrg implements Directory {
    @Override
    public String getId() {
        return null;
    }
 
    @Override
    public String getName() {
        return null;
    }
}

Class DirectoryBank
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
public class DirectoryBank implements Directory {
    @Override
    public String getId() {
        return null;
    }
 
    @Override
    public String getName() {
        return null;
    }
}

Метод initList
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
private void initList() {
        Hibernate hibernate = new HibernateCRUT();
        list = hibernate.read(str);
        tableModel = (DefaultTableModel) jTable1.getModel();
        tableModel.setNumRows(0);
 
        for (Object obj : list) {
            tableModel.addRow(new Object[]{
                    ((Directory) obj).getId(),
                    ((Directory) obj).getName()
            });
        }
    }

Class DirectoryMain
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class DirectoryMain {
 
//    private void initList() {
//        Hibernate hibernate = new HibernateCRUT();
//        list = hibernate.read(str);
//        tableModel = (DefaultTableModel) jTable1.getModel();
//        tableModel.setNumRows(0);
//
//        for (Object obj : list) {
//            tableModel.addRow(new Object[]{
//                    ((Directory) obj).getId(),
//                    ((Directory) obj).getName()
//            });
//        }
//    }
 
    public static void main(String[] args) {
        int n = 10;
        List<Object> list = new ArrayList();
        for (int i = 0; i < n; i++) {
            if(i ==1 || i==3 || i==7) {
                list.add(new DirectoryOrg());
            }else{
                list.add(new DirectoryBank());
            }
        }
 
        List<Object[]> list2 = new ArrayList<>();
        for (int i = 0; i < n ; i++) {
            Object obj = list.get(i);
            list2.add(new Object[] {
                    ((Directory)obj).getId(),
                    ((Directory)obj).getName(),
            });
        }
        for (Object[] strings : list2) {
            System.out.println((String)strings[0]+" "+(String)strings[1]);
        }
   
 
 
    }
}

Смотрите код. Идея в использовании интерфейса общего для классов DirectoryOrg и DirectoryBank
Как вариант можно использовать родительский класс вместо интерфейса.
Class DirectoryMain демонстрирует как все работает.
Одно замечание, использование списков и массивов типа Object это не самая лучшая практика.
0
0 / 0 / 0
Регистрация: 04.09.2017
Сообщений: 2
05.09.2017, 22:58  [ТС]
Огромное спасибо! Все получилось!
Но у меня возникла следующая проблема. Как упростить этот код? Как мне уйти опять же от instanceof?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void jButtonEditActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
        
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int index = (jTable1.getSelectedRow());
        
        
        Object obj = list.get(index);
        
        if(obj instanceof DirectoryOrg)
            {
                
                DirectoryOrg directoryOrg = (DirectoryOrg) obj;
                DirectoryOrgForm directoryOrgForm =  new DirectoryOrgForm(directoryOrg);  
                int locationX = (screenSize.width - directoryOrgForm.getWidth()) / 2;
                int locationY = (screenSize.height - directoryOrgForm.getHeight())/2;                             
                directoryOrgForm.setBounds(locationX, locationY, directoryOrgForm.getWidth(), directoryOrgForm.getHeight());
                directoryOrgForm.setVisible(true);
                
                        
            }else if(obj instanceof DirectoryBank)
            {            
                   
                 DirectoryBank directoryBank = (DirectoryBank) obj;                 
                 DirectoryBankForm directoryBankForm = new DirectoryBankForm(directoryBank);
                 int locationX = (screenSize.width - directoryBankForm.getWidth()) / 2;
                 int locationY = (screenSize.height - directoryBankForm.getHeight()) / 2; 
                 directoryBankForm.setBounds(locationX, locationY, directoryBankForm.getWidth(), directoryBankForm.getHeight());
                 directoryBankForm.setVisible(true);                
                       
            }
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
06.09.2017, 08:01
Class DirectoryForm абстрактный класс
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import javax.swing.*;
 
public abstract class DirectoryForm extends JComponent{
    private static int count = 0;
    protected int id= count++;
 
    public DirectoryForm() {
    }
 
    public DirectoryForm(DirectoryForm form) {
        this.id = form.id;
    }
 
    public abstract String getId();
    public abstract String getName();
 
}

Class DirectoryOrgForm
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class DirectoryOrgForm extends DirectoryForm {
 
    public DirectoryOrgForm() {
    }
 
    public DirectoryOrgForm(DirectoryForm form) {
        super(form);
    }
 
    @Override
    public String getId() {
        return "Id"+id;
    }
 
    @Override
    public String getName() {
        return "OrgName";
    }
}

Class DirectoryBankForm
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class DirectoryBankForm extends DirectoryForm {
 
 
    public DirectoryBankForm() {
    }
 
    public DirectoryBankForm(DirectoryForm form) {
        super(form);
    }
 
    @Override
    public String getId() {
        return "Id"+id;
    }
 
    @Override
    public String getName() {
        return "BankName";
    }
}

Class DirectoryMain
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
 
public class DirectoryMain {
 
    public static void main(String[] args) {
        int n = 10;
        List<Object> list = new ArrayList();
        for (int i = 0; i < n; i++) {
            if (i == 1 || i == 3 || i == 7) {
                list.add(new DirectoryOrgForm());
            } else {
                list.add(new DirectoryBankForm());
            }
        }
 
 
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 
        for (int index = 0; index < list.size(); index++) {
            Object obj = list.get(index);
            DirectoryForm directoryForm = (DirectoryForm) obj;
            int locationX = (screenSize.width - directoryForm.getWidth()) / 2;
            int locationY = (screenSize.height - directoryForm.getHeight()) / 2;
            directoryForm.setBounds(locationX, locationY, directoryForm.getWidth(), directoryForm.getHeight());
            directoryForm.setVisible(true);
            System.out.println(directoryForm.getId()+" "+directoryForm.getName());
        }
 
 
 
    }
}

Метод jButtonEditActionPerformed
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void jButtonEditActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
 
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int index = (jTable1.getSelectedRow());
 
 
        Object obj = list.get(index);
      
        DirectoryForm directoryForm = (DirectoryForm) obj;
        int locationX = (screenSize.width - directoryForm.getWidth()) / 2;
        int locationY = (screenSize.height - directoryForm.getHeight()) / 2;
        directoryForm.setBounds(locationX, locationY, directoryForm.getWidth(), directoryForm.getHeight());
        directoryForm.setVisible(true);
        System.out.println(directoryForm.getId()+" "+directoryForm.getName());
    }

Смотрите код. Суть та же, используется родительский класс с общими методами,
и избавляемся от instanceOf за счет наследования и полиморфизма.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.09.2017, 08:01
Помогаю со студенческими работами здесь

Оператор instanceof
В приведенном ниже коде создается экземпляр класса для работы с БД, должен создавать единожды, если попытаться создать еще раз, должен...

Не работает instanceof
Не хочет выводить ничего, что делать? class A{ function f($o){ $o instanceof A?&quot;Это объект класса А&quot;:&quot;Это не объект...

instanceof возвращает ошибку
Здравствуйте. Есть такой кусок кода. $xmlfile = 'xml.xml'; $options = SimpleXml_load_file($xmlfile); ...

Проверка instanceof внутри модуля
Всем доброго дня, var HttpServer = function(App) { if(App instanceof Application) { } };

Возможно ли обойти проверку на тип (instanceof)?
Есть класс A в котором есть публичный статический метод: public class A{ ... public static void sendSystemMessage(Object obj,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru