Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Обращение к переменным


Автор: Antropoid 16.12.2006, 12:01
Какой код корректнее?
I
Код

class MyClass {
    public static String str = "Hello";
}

class AnotherClass {
//    ...
    System.out.println(MyClass.str);
//    ...
}


II
Код

class MyClass {
    private static MyClass instance;

    public String str = "Hello";

    public static MyClass getInstance() {        
    return instance;
    }
}

class AnotherClass {
//    ...
    System.out.println(MyClass.getInstance().str);
//    ...
}


В коде I обращаемся к переменной str так:
MyClass.str, в коде II так - MyClass.getInstance().str. 
Какой из этих способов доступа предпочтительнее?

Автор: powerOn 16.12.2006, 12:49
Если str меняться не должна, то так потянет:
Код

class MyClass {
    public final static String str = "Hello";
}


Смысл второго примера я не понял.

Можно еще так:
Код

class MyClass {
    private static String str = "Hello";
    
    public static String getStr() {
        return str;
    }
}

Автор: Antropoid 16.12.2006, 13:02
Цитата(powerOn @  16.12.2006,  12:49 Найти цитируемый пост)
Смысл второго примера я не понял.

Как другим классам обращаться к переменным класса MyClаss, не имея объекта не него?

Автор: y3u 16.12.2006, 14:52
не совсем корректный пример... строка она вроде как считается имьютабл, а если еще вспомнить про пул строк, то тогда что так что эдак пофигу... для строк лияно я использую public static final филды... если объекты изменяемые - тогда надо подумать как они буду изменяться и сколько экземпляров класса должно быть, от этого и плясать...

Автор: Antropoid 17.12.2006, 22:38
Цитата(y3u @  16.12.2006,  14:52 Найти цитируемый пост)
что так что эдак пофигу

Ну разве нормально из других классов обращаться к полям класса посредством MyClass.str, если объект класса MyClass будет единственным в программе? С другой стороны такое обращение облегчает чтение кода.  Реализация же шаблона синглетон для доступа к переменным - громоздка...

Автор: y3u 17.12.2006, 22:57
Цитата(Antropoid @  17.12.2006,  22:38 Найти цитируемый пост)
Ну разве нормально из других классов обращаться к полям класса посредством MyClass.str


касательно строк - да, нормально. Я даже написал почему smile Ибо строки - это до некоторой степени неизменяемый объект... Так что это нормально - положить public static final константы, чтобы ими пользоваться при нужде минуя создание инстанса объекта, на то они и константы... Если внутри объекта присутствуют изменяемые поля, то наружу их вытаскивать крайне нежелательно, хотя есть случаи когда наоборот удобнее вытащить, к примеру класс ThreadLocal. А синглтон/не синглтон, тут надо решать исходя из задачи...

Автор: 0000 19.12.2006, 12:12
singleton тут не нужен...если ты хочешь дать доступ всем к строке - оставь static...
второй код абсолютно некорректен - ты там возвращаешь класс...но он у тебя не одиночка..смысла в нем нет

Автор: Antropoid 20.12.2006, 22:07
Цитата(0000 @  19.12.2006,  12:12 Найти цитируемый пост)
второй код абсолютно некорректен

Цитата(powerOn @  16.12.2006,  12:49 Найти цитируемый пост)
Смысл второго примера я не понял.

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

class MyClass {
    private static MyClass instance;
    MyClass() {
           instance = this;//<-----СОВСЕМ ЗАБЫЛ!!!
    }


    public String str = "Hello";

    public static MyClass getInstance() {        
        return instance;
    }
}

class AnotherClass {
//    ...
    System.out.println(MyClass.getInstance().str);
//    ...
}

Надеюсь теперь ответы изменятся...

Автор: powerOn 20.12.2006, 22:42
Цитата(Antropoid @  20.12.2006,  22:07 Найти цитируемый пост)
Надеюсь теперь ответы изменятся... 

 А когда конструктор будет вызван? 

Автор: y3u 20.12.2006, 22:53
ты наверное имел в виду примерно следующее... но это не всегда правильно
Код


public class MyClass {
    private static final MyClass INSTANCE = new MyClass();
    
    private MyClass() {
    }

    public static MyClass getInstance() {        
        return INSTANCE;
    }

...


ты, во-первых, реши сначала, зачем тебе синглтон... во-вторых можно почитать про его реализации вразных случаях...
http://skipy.dev.juga.ru/technics/singleton.html

а касательно статических полей все уже написали, если неизменяемый филд, то public static final, если изменяемый, то через объект и через паблик геттер...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)