![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| jer1 |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 123 Регистрация: 24.1.2005 Где: Харьков Украина Репутация: 4 Всего: 5 |
добрый день!,
если объявить метод foo вот так :
то что это мне даст?: семантическое подчеркивание что в коде не будет такого оператора
хотя если и будет, то после выхода из метода я всё равно получу указатель на первоначальный объект (ведь в метод ссылка передаётся по значению) я посмотрел конструкции в которых данный модификатор присутствует в исходниках jdk таковые присутствуют вот например один из конструкторов класса JTable:
зачем тут final? а документация javadoc эти модификаторы не показывает вот строка из api JTable(Object[][] rowData, Object[] columnNames) у кого-нибудь есть мысли? спасибо --------------------
:w!q |
||||||
|
|||||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
По-моему, это означает, что передаваемый объект не может изменяться. Константен в пределах данного метода.
Добавлено @ 15:31 Вообще, это ключевое слово имеет разную семантику при разных применениях. 1. Если мы объявлем класс, как final, то от него нельзя наследовать. 1. Если мы объявлем метод, как final, то его нельзя переопределять. 1. Если мы объявлем объект, как final, то его нельзя изменять. Згачение присваивается при инициализации, или при передаче в метод, как в данном случае. Надеюсь, ничего не напутал. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| jer1 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 123 Регистрация: 24.1.2005 Где: Харьков Украина Репутация: 4 Всего: 5 |
здесь показано, что состояние объекта является изменяемым вопрос про final в контексте объявления формальных параметров метода - есть ли в этом действительно польза (кроме удлинения кода), может это как-то связано с многозадачностью, во всяком случае классы System, Thread, ClassLoader содержат такие объявления методов --------------------
:w!q |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Да, проверил, действительно, действие модификатора распространяется только на сам объект, а не на его поля. То ли так и должно быть, то ли я чего-то не понимаю.
Думаю, польза от этого есть, хотя на практике еще не разу не применял. Знаю, что только final-методы могут быть inline => могут дать нам выигрыш в скорости. Что такое assert? -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| kashka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 Извеняюсь сейчас переведу. |
|||
|
||||
| jer1 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 123 Регистрация: 24.1.2005 Где: Харьков Украина Репутация: 4 Всего: 5 |
когда ты пишешь для себя, т.е контролируешь корректность передачу параметров, их обработку и т.д, то как правило используются assert. Т.е исходим из того, что алгоритм верен - ты просто убеждаешься (при помощи логического утверждения) в корректности каких-то элементов программы
сравнение с runtime-эксепшинами
во втором случае ты сам ответственен за то чтобы прайвет метод был вызван с корректным параметром, если этого не будет - алгоритм не верен при помощи assert ты об этом узнаешь и исправишь (при запуске программы утверждения можно включать/отключить даже селективно для разных пакетов, классов) ну а в первом случае клиент должен позаботиться об корректности параметра (javadoc метода об этом должен упоминать) см. также утверждения (assert) для динамического мониторинга программы java logging api --------------------
:w!q |
||||
|
|||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
kashka
Да, так тяжеловато Это сообщение отредактировал(а) Lamer George - 13.4.2005, 17:02 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| kashka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 29.11.2004 Где: Wolfenbuettel, Ge rmany Репутация: 1 Всего: 1 |
команда assert ставиться перед логическим выражением которое по предположению программиста true. Если это действительно так программа продолжает работу, со следующей комманды, в противном случае мы получаем AssertionError.
Добавлено @ 17:04 теперь дальше (тоже немного труднавато подходящие слова находить) Добавлено @ 17:05 Хотя jer1 уже все написал. Добавлено @ 17:07 Могу еще преимущества assert перед if написать, если интересно. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
jer1, kashka
Спасибо за объяснения. Добавлено @ 17:16
Буду признателен. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Для чего нужен final
:
Запуск дает:
Есть, случае с классами и методами. Например, есli метод нельзя перегрузить, вызов егo статичски связан, а нe динамически. -------------------- |
||||||
|
|||||||
| jer1 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 123 Регистрация: 24.1.2005 Где: Харьков Украина Репутация: 4 Всего: 5 |
а когда метод нельзя перегрузить, пример!) --------------------
:w!q |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
-------------------- |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Вот это и дает возможность компилятору встроить метод как инлайн-функцию, если, конечно, он сочтет это целесообразным. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| jer1 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 123 Регистрация: 24.1.2005 Где: Харьков Украина Репутация: 4 Всего: 5 |
а в таком примере модиф. final что-то даёт?
--------------------
:w!q |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
По-моему, никакой особой оптимизации это не даст, я думаю проверка идет на уровне компилятора.
Это просто удобно - видно что аргумент не меняется; кроме того, локальные классы могут обращаться к переменным в локальном скопе только если те final. -------------------- |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |