Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Общее использование объекта 
:(
    Опции темы
cmygeHm
  Дата 6.11.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



Можно перечитать тысячи книг и наверное никогда до этого не допереть. + стиль программирования у каждого свой.


Вобщем вопрос звучит так:

Пусть есть три класса - Class1, Class2 и Class3. Классу Class1 необходимы методы, которые инкапсулирует класс Class2. Тогда мы в коде класса Class1 создаем экзмепляр класса Class2 и юзаем его методы. Но вдруг возникла необходимость у класса Class3 вызвать методы класса Class2. И что??? Создавать еще один экземпляр в коде класса Class3? А если классов ClassN ??? Как правильно быть в такой ситуации??? Как создать экземпляр класса Class2 так, чтобы он был доступен всем и чтобы это было очень граммотно и красиво???



PS.Вообще я учусь/кодю на С++. А сейчас возникла необходимость написать курсовую на Java. Этот вопрос и С++ касается.

Всем большое спасибо.

smile 
PM MAIL   Вверх
Фантом
Дата 6.11.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Вообще говоря, наиболее правильный ответ - надо заранее проектировать классы так, чтобы ситуация "вдруг" возникнуть не могла. Исправлять что-то в структуре классов, когда часть кода уже написана, неправильно, поэтому любое решение в такой ситуации будет плохим.
PM   Вверх
fixxer
Дата 6.11.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Цитата(cmygeHm @  6.11.2009,  17:01 Найти цитируемый пост)
Пусть есть три класса - Class1, Class2 и Class3. Классу Class1 необходимы методы, которые инкапсулирует класс Class2. Тогда мы в коде класса Class1 создаем экзмепляр класса Class2 и юзаем его методы. Но вдруг возникла необходимость у класса Class3 вызвать методы класса Class2. И что??? Создавать еще один экземпляр в коде класса Class3? А если классов ClassN ??? Как правильно быть в такой ситуации??? Как создать экземпляр класса Class2 так, чтобы он был доступен всем и чтобы это было очень граммотно и красиво???


Не создавать экземпляр в классе, а передавать его через конструктор или сеттер, руками или IoC контейнером. Это если и в Class1 и Class3 нужен один и тот же экземпляр. Если разные, то почему бы и не создать?


--------------------
user posted image
PM MAIL ICQ   Вверх
cmygeHm
Дата 6.11.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



Цитата(Фантом @ 6.11.2009,  17:18)
Вообще говоря, наиболее правильный ответ - надо заранее проектировать классы так, чтобы ситуация "вдруг" возникнуть не могла. Исправлять что-то в структуре классов, когда часть кода уже написана, неправильно, поэтому любое решение в такой ситуации будет плохим.

я неправильно выразился немного. ситуация возникла не тогда, когда я написал пол проекта. ситуация стоит сейчас, когда создано всего три класса и они почти пусты. я учусь jav'е.
PM MAIL   Вверх
Temdegon
Дата 6.11.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Или, если это  какой-то общий класс, который нужен всем, но экземпляр всего один, то сделай его Singleton
PM MAIL   Вверх
cmygeHm
Дата 6.11.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



Цитата(fixxer @ 6.11.2009,  17:29)
Не создавать экземпляр в классе, а передавать его через конструктор или сеттер, руками или IoC контейнером. Это если и в Class1 и Class3 нужен один и тот же экземпляр. Если разные, то почему бы и не создать?

вот как вообще это у меня сейчас обстоит:

Класс1:

Код

package mainpackage;

public class FrameConnect extends JFrame {
    
    private JComboBox comboBox;
    private JPasswordField passwordField;

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FrameConnect frame = new FrameConnect();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public FrameConnect() {
        super();
        getContentPane().setFocusCycleRoot(true);
        getContentPane().setLayout(null);
        setBounds(100, 100, 329, 199);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JButton button = new JButton();
        button.addActionListener(new ActionListener() {
            
            public void actionPerformed(final ActionEvent e) {
                /* Connect to DataBase */
                DataBaseOperations db = new DataBaseOperations();
                if (db.ConnectToDB("rooms_admin", "123")) System.out.println("connected ...");
                else System.out.println("error connection");
                db.SelectLessors();
            }
        });
        button.setText("New JButton");
        button.setBounds(109, 116, 106, 26);
        getContentPane().add(button);

        passwordField = new JPasswordField();
        passwordField.setBounds(163, 64, 130, 20);
        getContentPane().add(passwordField);

        comboBox = new JComboBox();
        comboBox.setBounds(163, 22, 130, 25);
        getContentPane().add(comboBox);

        final JLabel label = new JLabel();
        label.setText("New JLabel");
        label.setBounds(44, 26, 66, 16);
        getContentPane().add(label);

        final JLabel label_1 = new JLabel();
        label_1.setText("New JLabel");
        label_1.setBounds(44, 66, 66, 16);
        getContentPane().add(label_1);
    }

}



Класс2:

Код

package mainpackage;

public class FrameMain extends JFrame {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FrameMain frame = new FrameMain();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public FrameMain() {
        super();
        getContentPane().setLayout(null);
        setBounds(100, 100, 571, 410);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JButton button = new JButton();
        button.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                
                /*Здесь необходимо просмотреть инфо из одной из таблицы БД. Получается создать еще один экземпляр???*/


            }
        });
        button.setText("New JButton");
        button.setBounds(10, 10, 106, 26);
        getContentPane().add(button);
        //
    }

}



Класс3:

Код

package mainpackage;

import java.sql.*;

public class DataBaseOperations {

    public boolean ConnectToDB(String user_name, String password){
        
         try
            {
                /*Инициализируем и загружаем драйвер   Мост JDBC-ODBC*/
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

                /*Устанавливаем связь с базой данных*/
                Connection con = DriverManager.getConnection("jdbc:odbc:mysql", user_name, password);
                return true;
            }
            catch(Exception ex)
            {
                System.out.println("Error occurred");
                System.out.println("Error: "+ex);
                return false;
            }
    }
    
    public void Disconnect(){
                          con.close();             
    }
    
    public void SelectLessors(){
        
    }

}



Добавлено через 2 минуты и 33 секунды
Не создавать экземпляр в классе, а передавать его через конструктор или сеттер, руками или IoC контейнером.

Или, если это  какой-то общий класс, который нужен всем, но экземпляр всего один, то сделай его Singleton

Вот эти два момета очень интересуют. Буду читать. А можете еще и подсказать что-нибудь.
PM MAIL   Вверх
Joil
Дата 6.11.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 24.1.2008

Репутация: нет
Всего: 8



Может я что то не понл... а разве вот так сделать нельзя:
Код

public class Class2 {
    private static Class2 class2;
    
    private Class2() {
        
    }

    public static Class2 getInstance() {
        if (class2 == null) {
            class2 = new Class2();
        }
        return class2;
    }
}

--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
cmygeHm
Дата 6.11.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



Joil,  я не волшебник! я только учусь. я пишу курсовую на jav'e. Резкий переход с С++ на java. Вроде все идет хорошо. Но возник этот вопрос.
Кстати вот ответ читаю:

http://habrahabr.ru/blogs/complete_code/27108/

Добавлено через 14 минут и 49 секунд
и как после вот этого:

Код

public class Class2 {
    private static Class2 class2;
    
    private Class2() {
        
    }

    public static Class2 getInstance() {
        if (class2 == null) {
            class2 = new Class2();
        }
        return class2;
    }
}


создавать экземпляр надо? или что?
PM MAIL   Вверх
cmygeHm
Дата 6.11.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



конструкто класса теперь невидим, оно и видно - 
Код

    private Class2() {
        
    }


и что делать? 

объявляю в классе Class1:

Код

    public Class1 cl;

и обращаюсь всегда к cl ???

PM MAIL   Вверх
Joil
Дата 6.11.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 24.1.2008

Репутация: нет
Всего: 8



cmygeHm ну вот в классе 1 и 3 сделай вот так допустим:
Код

public class Class1 {
    private Class2 class2 = Class2.getInstance();
    //...
}

Код

public class Class3 {
    private Class2 class2 = Class2.getInstance();
    //...
}

Это и будет у тебя один объект в 2х классах.
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
AxNe0
Дата 6.11.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 24.4.2006
Где: St. Petersburg

Репутация: 4
Всего: 5



Цитата(Joil @  6.11.2009,  19:06 Найти цитируемый пост)
Может я что то не понл... а разве вот так сделать нельзя:
Код

......



Собственно, это как раз и называется Singleton smile


--------------------
SCJP 6, SCBCD 5, OCEWSD 6
blog
PM ICQ Skype   Вверх
Joil
Дата 6.11.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 24.1.2008

Репутация: нет
Всего: 8



Да, AxNe0, я уже прочитал... хех, знал как делать но как называется незнал... smile 
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
cmygeHm
Дата 6.11.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



винград! спасибо! smile
PM MAIL   Вверх
cmygeHm
Дата 6.11.2009, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



так что получается?  если у меня Класс2 нужен в ста других классах, то 
Код


public class Class4 {
    private Class2 class2 = Class2.getInstance();
    //...
}
public class Class5 {
    private Class2 class2 = Class2.getInstance();
    //...
}
public class Class6 {
    private Class2 class2 = Class2.getInstance();
    //...
}

...

public class Class100 {
    private Class2 class2 = Class2.getInstance();
    //...
}




????? smile 
PM MAIL   Вверх
Temdegon
Дата 7.11.2009, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Ну это же лучше, чем
Код

public class Class4 {
    private Class2 class2 = new Class2();
    //...
}
public class Class5 {
    private Class2 class2 =new Class2();
    //...
}
public class Class6 {
    private Class2 class2 = new Class2();
    //...
}
...
public class Class100 {
    private Class2 class2 = new Class2();
    //...
}

 если тебе достаточно одного экземпляра этого класса.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.