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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение строк или указателей на строки? Почему работает сравнение? 
:(
    Опции темы
Connie
Дата 12.10.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В примерах SUN нашел такой код
Код

public void propertyChange(PropertyChangeEvent evt) {
        if ("progress" == evt.getPropertyName() ) {

Код взят тут

И хотя выдается предупреждение 
Цитата
Comparing String with == or !=
 сравнение работает. Но если я правильно понял вот эта строка "progress" идентична new String("progress"), а если так, то сравниваться должны указатели на объекты и сравнение не должно проходить.

Почему же в этом случае оно работает? Или же это предусмотренное отступление от объектной модели данных? Вроде String не примитивный тип?
http://java.sun.com/docs/books/tutorial/ja.../datatypes.html

Я знаю, что строки надо сравнивать используя somestring.equals(otherstring)

PM MAIL WWW   Вверх
Platon
Дата 12.10.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



возможно evt.getPropertyName() возвращает ссылку на константную строку, и при запуске программы "progress" и getPropertyName(), если getPropertyName() возвращает "progress", а не new String("progress"), то == или != будут работать.

Цитата(Connie @  12.10.2008,  11:18 Найти цитируемый пост)
Но если я правильно понял вот эта строка "progress" идентична new String("progress")

Нет неправильно понял.

Добавлено через 3 минуты и 48 секунд
Хотя, как я заметил хорошим тоном является следующий код:

Код

class PropertyTest {
    public static final String PROP_NAME = "prop.name";
}
// ....
public void propertyChange(PropertyChangeEvent evt) {
        if (PropertyTest.PROP_NAME == evt.getPropertyName() ) {
// ....

При формировании объекта PropertyChangeEvent также устанавливаем propertyName PropertyTest.PROP_NAME
PM MAIL ICQ   Вверх
Connie
Дата 12.10.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Platon, то есть константы сравнивать можно именно потому, что компилятор создаст не два экземпляра "progress", а один?
Если так, то понятно smile
Цитата
Хотя, как я заметил хорошим тоном является следующий код:
Это понятно  smile но источник кода я не зря указал.

PM MAIL WWW   Вверх
Platon
Дата 12.10.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(Connie @  12.10.2008,  12:01 Найти цитируемый пост)
то есть константы сравнивать можно именно потому, что компилятор создаст не два экземпляра "progress", а один?

Верно.

Добавлено через 8 минут и 19 секунд
Цитата(Connie @  12.10.2008,  12:01 Найти цитируемый пост)
Это понятно  smile но источник кода я не зря указал.

Придется мириться и не плодить больше подобный код. В туториале подобный подход из-за того, что в SwingWorker так нехорошо сделали.
PM MAIL ICQ   Вверх
Connie
Дата 12.10.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда получается в обработчиках событий лучше использовать первый вариант, чем второй, т.к. сравнение указателей должно происходить быстрее, правильно?
Код

 public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
     
        // Handle each button.
//Это сравнение быстрее
        if (PROG_EXIT==e.getActionCommand()) {
            dispose();
            System.exit(0);
        }   
//А это медленнее
        else if (NEW_GR.equals(cmd)){
            addNewGroup();
        }

Верно?

Извините, что по всякой ерунде Вас достаю

Это сообщение отредактировал(а) Connie - 12.10.2008, 14:51
PM MAIL WWW   Вверх
Platon
Дата 12.10.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(Connie @  12.10.2008,  15:48 Найти цитируемый пост)
сравнение указателей должно происходить быстрее, правильно?

абсолютно верно
PM MAIL ICQ   Вверх
ivg
Дата 12.10.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

Репутация: 33
Всего: 81



Цитата(Connie @  12.10.2008,  17:48 Найти цитируемый пост)
Тогда получается в обработчиках событий лучше использовать первый вариант, чем второй

Нет.
PM MAIL   Вверх
Platon
Дата 12.10.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(ivg @  12.10.2008,  19:31 Найти цитируемый пост)
Нет. 

ммм, а почему?
PM MAIL ICQ   Вверх
Connie
Дата 12.10.2008, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот давайте рассуждать
вначале создается константа
private final static String MY_COMMAND = "start_doing";

Потом у какого то элемента создается 
SomeUnit.addActionListener(some_where);
SomeUnit..setActionCommand(MY_COMMAND);

Это будет означать передачу объекту SomeUnit ссылки на MY_COMMAND, которая потом и будет сравниваться на идентичность с сама с собой
if (MY_COMMNAD==e.getActionCommand())
Вряд ли в этом экземпляре объекта будет создаваться копия объекта. Хотя вдруг будет?

И если я правильно понимаю то, как даются адреса объектам, то неверное совпадение может быть лишь в случае ссылки указывающей на null.

Разумеется если я забуду указать final, static то тогда возможны различные коллюзии. Но рассуждая так можно какое угодно ограничение придумать  smile 

Это сообщение отредактировал(а) Connie - 12.10.2008, 20:48
PM MAIL WWW   Вверх
Platon
Дата 12.10.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(Connie @  12.10.2008,  21:44 Найти цитируемый пост)
Хотя вдруг будет?

Я полагаю, что может быть по-разному в разных реализациях JVM, хотя, возможно, это закреплено железно в спецификациях. Но в в JVM от Sun не создаются. 

НО если в официальном туториале они прибегают к подобного рода коду, то это можно считать обычной практикой.
Цитата(Connie @  12.10.2008,  21:44 Найти цитируемый пост)
Разумеется если я забуду указать final, static то тогда возможны различные коллизии.

непонятно о чем это.
PM MAIL ICQ   Вверх
ivg
Дата 12.10.2008, 21:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

Репутация: 33
Всего: 81



Цитата(Platon @  12.10.2008,  22:09 Найти цитируемый пост)
ммм, а почему?

Код

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.swing.JCheckBox;

public class Main {

    static final String cb_command = "Action_Command";

    public static void main(String[] args) throws Exception {
        JCheckBox cb = new JCheckBox("test");
        cb.setActionCommand(cb_command);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(cb);
        oos.flush();
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
        JCheckBox newcb = (JCheckBox)ois.readObject();
        System.out.println(cb.getActionCommand() == newcb.getActionCommand());
        System.out.println(cb.getActionCommand().equals(newcb.getActionCommand()));
    }
}

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Несмотря на то, что GUI с сериализацией сильно не дружат, пожалуй, придется согласиться.

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

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

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


 




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


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

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