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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> модификатор final, параметров метода 
:(
    Опции темы
batigoal
Дата 14.4.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Цитата(jer1 @ 14.4.2005, 09:40)
а в таком примере модиф. final что-то даёт?

Навряд ли, ведь для простого типа будет передано значение, а не ссылка.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
RTFM/STFW
  Дата 18.4.2005, 18:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Lamer @ 13.4.2005, 16:18)
Да, проверил, действительно, действие модификатора распространяется только на сам объект, а не на его поля. То ли так и должно быть, то ли я чего-то не понимаю.


Be aware that declaring an object attribute final does not prevent it from being changed. In fact, the final only applies to the reference to the object and not the object itself.
  Вверх
batigoal
Дата 18.4.2005, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Логично. Неизменяемой объявляется ссылка, а не объект.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Zandr
Дата 22.4.2005, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мало того smile если массив объявим как final, то его элементы менять можно. Короче final запрещает операцию присваивания проводить больше (и меньше) одного раза. В случае с параметром метода - если есть final, мы можем быть уверены, что в любом месте этого метода мы работаем именно с тем объектом, который был передан в качестве параметра.
PM MAIL   Вверх
batigoal
Дата 22.4.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Массив ведь - тоже объект, и когда мы передаем массив, то передаем неизменяемую ссылку на него.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Zandr
Дата 22.4.2005, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Короче есть объекты видимые только в методе во время его выполнения. Это объекты, которые объявляются в этом методе и параметры метода. Если мы в этом же методе делаем иннер-класс, который обращается к отмеченным выше объектам - эти объекты должны быть объявлены как final.
Попробуйте из примера ниже убрать final из сигнатуры метода - не скомпилируется:
Код

// file Inner.java
public class Inner
{
    public static void main( String[] args)
    {
        new Inner().print( "Hello from final!!!");
    }

    void print( final String s)
    {
        new Object()
        {
            {
                System.out.println( s);
            }
        };
    }
}

Хотя Domestic Cat об этом уже написал smile

Это сообщение отредактировал(а) Zandr - 22.4.2005, 13:00
PM MAIL   Вверх
simanyay
Дата 22.4.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


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

Репутация: 3
Всего: 36



Кстати это свойство final можно использовать для реализации паттерна Singleton:
Код

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

    private MySingleton() {
        // ...
    }

    public static getInstance() {
        return INSTANCE;
    }

    // Другой код
}


Зато так мы будем точно знать, что существует один и только один объект класса MySingleton.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
batigoal
Дата 22.4.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



simanyay
Здесь, в принципе, можно и не указывать final. Мы ведь все равно не сможем создать еще один объект MySingleton - у него же нет неприватного конструктора.
Но хуже, конечно, не будет.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Се ля ви
Дата 3.5.2005, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

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



Народ, всё проще. Эккель пишет, что final - это просто напросто замена вызова метода его телом на уровне компиляции. т.е. это указание на то, что методом это считать нужног только в рамках исходника для понятности кода, а реально - это не метод никакой, а просто кусок другого метода в тех местах, где в коде он вызывается.

Даёт это экономию при быстродействии программы, поскольку операция вызова метода сопряжена с дополнительными издержками в частности на выделение памяти под контекст. Здесь получается экономия, но платить за неё приходится невозможностью наследования, что очень неудобно когда речь идёт о многократно-используемых библиотеках.


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
batigoal
Дата 3.5.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Цитата
Эккель пишет, что final - это просто напросто замена вызова метода его телом на уровне компиляции. т.е. это указание на то, что методом это считать нужног только в рамках исходника для понятности кода, а реально - это не метод никакой, а просто кусок другого метода в тех местах, где в коде он вызывается.

По-моему, он писал не совсем так. Это рекомендация компилятору, которая совсем не обязательно будет выполнена.
К тому же, это справедливо для методов и констант простых типов, но никак не для объектов или классов smile Так что все не так просто.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
simanyay
Дата 3.5.2005, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


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

Репутация: 3
Всего: 36



Цитата(Lamer @ 22.4.2005, 14:59)
simanyay
Здесь, в принципе, можно и не указывать final. Мы ведь все равно не сможем создать еще один объект MySingleton - у него же нет неприватного конструктора.
Но хуже, конечно, не будет.


Но тогда мы сможем после вызова getInstance заменить объект на другой.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
Zandr
Дата 4.5.2005, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Народ, всё проще. Эккель пишет, что final - это просто напросто замена вызова метода его телом на уровне компиляции.

Укажи, пожалуйста, где он это пишет, только точно, чтобы можно было найти. Очень интересно было бы увидеть это своими глазами.
И еще вопрос был про final применительно к параметрам метода, а не к самому методу, или классу, или instance member'у.

Цитата
Но тогда мы сможем после вызова getInstance заменить объект на другой.

Только в одном из методов этого класса и никак иначе. Конструктор-то private.
PM MAIL   Вверх
Се ля ви
Дата 4.5.2005, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

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



Zandr
угу, мне тоже стало интересно этот момент перечитать уже smile Вечерком поищу.


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
simanyay
Дата 4.5.2005, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


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

Репутация: 3
Всего: 36



Цитата(Zandr @ 4.5.2005, 09:46)
Только в одном из методов этого класса и никак иначе. Конструктор-то private.


Почему? А так

Код

MySingleton m = MySingleton.getInstance();

m = null;

// Где-то дальше...

MySingleton m1 = MySingleton.getInstance();

m1.someMethod(); // NullPointerException


?


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
batigoal
Дата 4.5.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Исключений нет. m=null, но INSTANCE спокойно сидит в памяти.


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

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

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


 




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


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

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