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

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

04.09.2017, 22:54. Показов 4922. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru