![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| nornad |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Или я совсем старый стал и ничего не смыслю в модификаторах доступа, или в указанной ждк баг.
Вот пример:
Вопрос: как это может работать? Добавлено через 8 минут и 47 секунд М-да... прошу прощения, я действительно ничего не понимаю в модификаторах доступа. Нашёл тут в довольно старенькой книжке (точнее, в заметках, сделанных по книжке), что
Имхо, несколько странное поведение для защищённых полей и методов, но "описанный баг - уже не баг, а фича". P.S. Просьба к модераторам: не удаляйте тему. Думаю, найдутся и другие "ничего не смыслящие". -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
||||||
|
|||||||
| jsa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 704 Регистрация: 19.1.2006 Где: Новосибирск Репутация: нет Всего: 20 |
хм... очень интересно, не знал таких подробностей, поэтому порылся на java.sun.com и вот что нашел
modifiers -------------------- Все мы, на перине с песней, строим небо на земле © Ю. Шевчук |
|||
|
||||
| Ulysses4j |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 2 Всего: 10 |
Давайте не будем томить народ, там речено:
Лично мне такое не нравится - Delphi вспоминается... Это сообщение отредактировал(а) Ulysses4j - 26.6.2007, 06:06 -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
||||
|
|||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
Собственно это как бы прописная истина ;) И еще: если сабж без модификатора, то ведет он себя именно так, как ты хочешь, чтобы вел себя protected ;) |
|||
|
||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 2 Всего: 10 |
+1 Добавлено через 4 минуты и 52 секунды
Хотите сказать, что package-private и protected это одно и то же? Сомневаюсь. Если подкласс данного класса находится в другом пакете, то protected-члены базового ему будут видны, а package-private базового - нет. -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Не скажи. Судя по информации на офсайте поле без модификатора ведёт себя не так, как protected в том же с++. Смотрим в табличку и видим, что такое поле видно в пределах пакета, но не будет видимым классу-потомку, который лежит в другом пакете. "Стандартный" же protected наоборот подразумевает видимость потомкам, а не пакету. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| fixxer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 14.9.2006 Где: Саратов, Россия Репутация: 6 Всего: 27 |
Вся эта котовасия происходит от желания _четко_ разделить иерархию доступа, то есть, чтобы одна полностью включала другой.
public protected package private И вследствие этого к пакетам следует относиться внимательнее, помня, что это не только средство модульной декомпозиции, но и средство инкапсуляции. Это сообщение отредактировал(а) fixxer - 26.6.2007, 09:24 -------------------- ![]() |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
В Java он ведет себя именно так как описано выше, с самой первой версии. О причинах fixxer уже написал. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
М-да... что-то я всё же заглючил. protected ведёт себя почти так, как я и понимал. Так же как и no modifier.
Единственный момент, которого я не знал - это, что protected виден и всем внутри пакета. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| progdog |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
В книжке "Секреты программирования для Internet для Java" еще по jre 1.0 было написано, что тогда во всяком случае был еще один модификатор. Цитата с книжки:
Его убрали скорее всего потому что разработчикам захотелось, чтобы было по одному модификатору доступа. А про protected там написано:
Кстати именно этот модификатор присваивается если ничего не указывать. А до того как я прочитал эту книжку я искренне думал, что в остальных книжках написана правда. Это сообщение отредактировал(а) progdog - 30.6.2007, 11:59 |
||||
|
|||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: нет Всего: 11 |
Если не ошибаюсь, то, если ничего не указывать присваивается "доступ по умолчанию" или пакетный доступ. Т.е. наследник из другого пакета не будет видеть. -------------------- <удалено администрацией форума> |
|||
|
||||
| EvgenZ |
|
||||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: нет Всего: 11 |
Это сообщение отредактировал(а) EvgenZ - 30.6.2007, 09:32 -------------------- <удалено администрацией форума> |
||||
|
|||||
| progdog |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
Я не знаю с чего вы взяли что при protected оно заработает, но во всяком случае в Eclipse оно выдаст ошибку. Даже если компилятор это и откомпилирует, я Eclipse выкидывать на помойку не собираюсь.
Я вот так тестил:
Это сообщение отредактировал(а) progdog - 30.6.2007, 13:44 |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Там ошибка в том, что нет импорта для Parent-а. А в остальном код полностью корректный. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| progdog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
Ну да, точно
Но это все равно сути дела не меняет. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Какой сути? Если ты про то, что Eclipse показывает для данного кода ошибку, то выкини его. Потому как или он поддерживает язык или нафиг он вообще сдался. Только я думаю, это ты что-то перепутал, т.к. не может Eclipse давать ошибку в таком тривиальном случае. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
progdog привёл всё же не тот пример, на котором получил ошибку. Вот если бы в классе Child метод test() был бы таким
то была бы ошибка - класс-наследник в другом пакете может вызывать protected-метод только для себя, для других объектов Child или наследников Child. Это сообщение отредактировал(а) w1nd - 1.7.2007, 04:12 -------------------- ![]() ![]() |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Ну это правильное поведение, я даже видел объяснение почему так.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| progdog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
Извиняюсь,
|
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Мой преподаватель настоятельно рекомендовал не пользоваться protected в подаваляющем большинстве случаев. Либо private, либо public.
-------------------- SCJP 5.0, SCJD |
|||
|
||||
| heraclitus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 25.6.2007 Репутация: нет Всего: нет |
"Если Вы создаете новый пакет и наследуете класс из другого пакета, то единственные члены, к которым Вы имеете доступ, это публичные члены в исходном пакете. (Конечно, если наследование происходит в том же самом пакете, Вы имеете нормальный пакетный доступ для всех “дружественных” членов.) Но иногда, создатель базового класса хочет разрешить доступ к конкретному члену только для наследуемого класса, но не всему миру в целом. Именно это делает protected".
Модификатор доступа без имени называют дружественным. "...дружественные элементы имеют доступ на уровне пакета..." ...все другие классы в том же пакете имеют доступ к дружественным членам, но для классов за пределами этого пакета, члены являются приватными (private). Цитаты взяты из Эккель "Думаем на Java 2". Вывод: дружественный и защищенный модификаторы похожие, но не идентичные. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
niasilil, а почему?
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Он работает на бирже, руководит QA отделом и смотрит на все со своей колокольни. То что должно быть скрыто - все private, это понятно. Никаких полумер. А то что открыто, пусть даже с дефолтным или protected модификатором, это любой другой человек из команды может использовать (и изменить) в другом месте программы. Значит отвечать кому? Правильно, тебе, потому что это твой кусок кода. Он нам говорил rule of thumb - если пишешь protected, то подумай еще раз, все шансы что ты на неправильном пути. -------------------- SCJP 5.0, SCJD |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Т.е. такого случая, как необходимость доступа к полю, например, в наследнике, он даже не рассматривает?
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Не говоря уже о переопределяемых методах в наследниках - вообщем-то protected достаточно удобная идея.
|
|||
|
||||
| niasilil |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Ну не все так плохо, рассматривал Вобщем, просто пожелаение - подумать. Добавлено через 2 минуты и 49 секунд
Да, конечно, никто и не спорит. -------------------- SCJP 5.0, SCJD |
||||
|
|||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Многолетний опыт говорит о том, что как ни делай проверки, а всё равно найдётся тот самый "придурок", который сумеет-таки это дело завалить. Естественно, это не умаляет достоинств проверок как таковых. Просто, кроме проверок, надо и саму структуру объектов делать хорошей, в чём protected всё же больше помогает, чем мешает. А вашему преподавателю я могу сказать лишь то, что у него малость не всё в порядке с мозгом. Его позиция похожа на позицию одной преподавательницы в ВУЗе, где я учился. Она считала, что GOTO - вещь опасная и ненужная, а потому его нельзя использовать. Все, кто использовали GOTO в программе, имели проблемы при сдаче задания. Я согласен, что злоупотреблять им не стоит, но бывают в жизни ситуации, когда использовать GOTO явно предпочтительнее, чем пытаться заменить его иными конструкциями. То же самое и с protected в жабе. Ваше право не использовать что-либо, но вы не сможете доказать, что это объективно обоснованно во всём спектре задач. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Мы перетираем воду в ступе, обсуждаем очевидные вещи. Причем даже не противоречим друг другу. Ваш пример про GOTO как нельзя лучше описывает ситуацию. Именно эту мысль "что злоупотреблять не стоит" я и пытался донести. Добавлю что если цена ошибки велика, то нужно рассматривать все возможные гипотетические неприятности. -------------------- SCJP 5.0, SCJD |
|||
|
||||
| nornad |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Согласен, вопрос больше риторический. Я, кстати, не в плане спора с тобой (будто ты придерживаешься иного мнения), а в плане реакции на позицию твоего преподавателя. (Давай на "ты" - не такие уж мы и древние
Все в любом случае не рассмотришь, а посему лично я предпочитаю чистую и ясную структуру объектов, а не возможную защищённость кода на основе геттеров/сеттеров с не меньшей возможностью потерять читабельность из-за неочевидных действий внутри упомянутых методов. С другой стороны, если сам объект предполагает наличие защиты при установке получении значения поля, то, естественно, эти методы просто обязательны. Правда, такая защита для protected- и private- полей нужна, по-моему, нечасто. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
А потом найдется умник которому это надо позарез, и он полезет через рефлексию Я не понимаю как можно так работать в команде, что приходится защищаться от своих-же коллег Да и при чем тут ты, это же его код привел к ошибке. Ведь если я запишу неправильные данные в файл, мне что винить разработчиков JDK, потому что они не добавили нужные проверки в FileOutputStream? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Я такое уже разок встретил. Долгой работы с этой командой у меня не вышло почему-то. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Ну так он нам и приводил примеры из жизни. Работает он на Чикагской бирже, цена ошибки - сотни тысяч, миллионы денег. Естественно, при такой потере нужен козел отпущения. Им будет тот, у кого код сработал неправильно. Если кто то изменит твой объект без всех предусмотренных проверок, то может сложится все что угодно. Виноват будет скорее всего тот кто неправильно туда записал, понятен пень. Но ведь можно и под раздачу попасть и на пару вылететь. Собственно, это не есть недоверие к работе других, это ответственность за свой участок. По моему так. -------------------- SCJP 5.0, SCJD |
|||
|
||||
| Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
А отдел тестирования? Если они приняли продукт и он попал в production, то все вопросы в такой ситуации только к ним. |
|||
|
||||
![]()
|
| Правила форума "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. |