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

Поиск:

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


Шустрый
*


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

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



добрый день!,

если объявить метод foo вот так :

Код

static void foo(final Object obj){
// some code

}


то что это мне даст?: семантическое подчеркивание что в коде не будет
такого оператора

Код

obj = new Object();


хотя если и будет, то после выхода из метода я всё равно получу указатель на
первоначальный объект (ведь в метод ссылка передаётся по значению)


я посмотрел конструкции в которых данный модификатор присутствует в исходниках jdk

таковые присутствуют

вот например один из конструкторов класса JTable:
Код

public JTable(final Object[][] rowData, final Object[] columnNames) {


зачем тут final? а документация javadoc эти модификаторы не показывает
вот строка из api
JTable(Object[][] rowData, Object[] columnNames)


у кого-нибудь есть мысли?
спасибо


--------------------
:w!q
PM MAIL   Вверх
batigoal
Дата 13.4.2005, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



По-моему, это означает, что передаваемый объект не может изменяться. Константен в пределах данного метода.
Добавлено @ 15:31
Вообще, это ключевое слово имеет разную семантику при разных применениях.
1. Если мы объявлем класс, как final, то от него нельзя наследовать.
1. Если мы объявлем метод, как final, то его нельзя переопределять.
1. Если мы объявлем объект, как final, то его нельзя изменять. Згачение присваивается при инициализации, или при передаче в метод, как в данном случае.

Надеюсь, ничего не напутал.


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


Шустрый
*


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

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



Код

public class Dummy{

    public static void main(String[] args){
        Data d = new Data(0);
        foo(d);
        assert d.i == 111;
    }

    static void foo(final Data d){
        d.i = 111;
    }

    static class Data{
        int i;
        Data(int i){
            this.i = i;
        };
    }

}


здесь показано, что состояние объекта является изменяемым

вопрос про final в контексте объявления формальных параметров метода - есть ли в этом действительно польза (кроме удлинения кода), может это как-то связано с многозадачностью, во всяком случае классы System, Thread, ClassLoader содержат такие объявления методов

--------------------
:w!q
PM MAIL   Вверх
batigoal
Дата 13.4.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Да, проверил, действительно, действие модификатора распространяется только на сам объект, а не на его поля. То ли так и должно быть, то ли я чего-то не понимаю.

Цитата(jer1 @ 13.4.2005, 15:45)
есть ли в этом действительно польза (кроме удлинения кода)

Думаю, польза от этого есть, хотя на практике еще не разу не применял. Знаю, что только final-методы могут быть inline => могут дать нам выигрыш в скорости.

Что такое assert?



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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

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



Seit dem JDK 1.4 gibt es in Java eine assert-Anweisung. Diese, ursprünglich schon für die erste JDK-Version vorgesehene, dann aber aus Zeitgründen zurückgestellte Anweisung wird C- oder C++-Programmierern wohlbekannt sein. Sie dient dazu, an einer bestimmten Stelle im Programmablauf einen logischen Ausdruck zu plazieren, von dem der Programmierer annimmt, daß er stets wahr ist. Ist das der Fall, fährt das Programm mit der nächsten Anweisung fort, andernfalls wird eine Ausnahme des Typs AssertionError ausgelöst. Ein solcher Ausdruck wird auch als Invariante bezeichnet, denn er bleibt unverändert true, solange das Programm korrekt funktioniert.
JDK1.1-1.4



Assertions, wie assert-Anweisungen vereinfachend genannt werden, dienen also dazu, bestimmte Annahmen über den Zustand des Programmes zu verifizieren und sicherzustellen, daß diese eingehalten werden. Soll im Programm beispielsweise überprüft werden, ob eine Variable x nicht-negativ ist, könnte dazu die folgende assert-Anweisung verwendet werden:

assert x >= 0;

Das Programm überprüft die Bedingung und fährt fort, wenn sie erfüllt ist. Andernfalls wird eine Ausnahme ausgelöst. Natürlich hätte derselbe Test auch mit Hilfe einer einfachen if-Anweisung ausgeführt werden können. Die assert-Anweisung hat ihr gegenüber jedoch einige Vorteile:

Der Programmcode ist kürzer.
Auf den ersten Blick ist zu erkennen, daß es sich um einen Korrektheits-Check handelt und nicht um eine Verzweigung zur Steuerung des Programmablaufs.
Assertions lassen sich zur Laufzeit wahlweise an- oder ausschalten. Im Gegensatz zu einer einfachen if-Anweisung verursachen sie praktisch keine Verschlechterung des Laufzeitverhaltens, wenn sie deaktiviert sind.
Der im Syntaxdiagramm angegebene ausdruck1 muß immer vom Typ boolean sein, andernfalls gibt es einen Compilerfehler. Fehlt ausdruck2 (er darf von beliebigem Typ sein), wird im Falle des Nichterfülltseins der Bedingung ein AssertionError mit einer leeren Fehlermeldung erzeugt. Wurde ausdruck2 dagegen angegeben, wird er im Fehlerfall an den Konstruktor von AssertionError übergeben und dient als Meldungstext für das Fehlerobjekt.


Добавлено @ 16:56
Извеняюсь сейчас переведу.
PM MAIL   Вверх
jer1
Дата 13.4.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



когда ты пишешь для себя, т.е контролируешь корректность передачу параметров, их обработку и т.д, то как правило используются assert. Т.е исходим из того, что алгоритм верен - ты просто убеждаешься (при помощи логического утверждения) в корректности каких-то элементов программы

сравнение с runtime-эксепшинами

Код

public void calculate(Item item){
if (item == null) throw new IllegalArgumentException("низя null"); 
//process code
}


Код

private void calculate(Item item){
assert item == null: "низя null"; 
//process code
}


во втором случае ты сам ответственен за то чтобы прайвет метод был вызван с корректным параметром, если этого не будет - алгоритм не верен
при помощи assert ты об этом узнаешь и исправишь (при запуске программы утверждения можно включать/отключить даже селективно для разных пакетов, классов)

ну а в первом случае клиент должен позаботиться об корректности параметра (javadoc метода об этом должен упоминать)



см. также
утверждения (assert)

для динамического мониторинга программы java logging api


--------------------
:w!q
PM MAIL   Вверх
batigoal
Дата 13.4.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



kashka
Да, так тяжеловато smile

Это сообщение отредактировал(а) Lamer George - 13.4.2005, 17:02


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

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



команда assert ставиться перед логическим выражением которое по предположению программиста true. Если это действительно так программа продолжает работу, со следующей комманды, в противном случае мы получаем AssertionError.
Добавлено @ 17:04
теперь дальше (тоже немного труднавато подходящие слова находить) smile
Добавлено @ 17:05
Хотя jer1 уже все написал.
Добавлено @ 17:07
Могу еще преимущества assert перед if написать, если интересно.
PM MAIL   Вверх
batigoal
Дата 13.4.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



jer1, kashka
Спасибо за объяснения.

Добавлено @ 17:16
Цитата(kashka @ 13.4.2005, 17:03)
Могу еще преимущества assert перед if написать, если интересно

Буду признателен.


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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Для чего нужен final
:
Код

public class A 
{   
    public static void main(String[] a)
    {
        Integer i = new Integer(9);
        doMethod(i);
    }
    
    public static void doMethod(final Integer i)
    {
        i = new Integer(9);
    }
}



Запуск дает:
Цитата
A.java:13: final parameter i may not be assigned
        i = new Integer(9);


Цитата
вопрос про final в контексте объявления формальных параметров метода - есть ли в этом действительно польза (кроме удлинения кода), может это как-то связано с многозадачностью, во всяком случае классы System, Thread, ClassLoader содержат такие объявления методов


Есть, случае с классами и методами. Например, есli метод нельзя перегрузить, вызов егo статичски связан, а нe динамически.


--------------------

PM   Вверх
jer1
Дата 13.4.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Есть, случае с классами и методами. Например, есli метод нельзя перегрузить, вызов егo статичски связан, а нe динамически.


а когда метод нельзя перегрузить, пример!)

--------------------
:w!q
PM MAIL   Вверх
Domestic Cat
Дата 13.4.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Код

class A
{
      public final void B()  
      {}
}

class C extends A
{
      public void B()  //-- ошибка времени компиляции
      {} 
}



--------------------

PM   Вверх
batigoal
Дата 13.4.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Domestic @ 13.4.2005, 18:41)
Например, есli метод нельзя перегрузить, вызов егo статичски связан, а нe динамически.

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


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


Шустрый
*


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

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



а в таком примере модиф. final что-то даёт?
Код

 public void b(final int a){} // контекст: параметры метода

--------------------
:w!q
PM MAIL   Вверх
Domestic Cat
Дата 14.4.2005, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



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


--------------------

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

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

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


 




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


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

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