0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
|
|
1 | |
Внутренние классы (сокрытие реализации)20.12.2015, 23:53. Показов 2413. Ответов 18
Метки нет (Все метки)
Когда мы создаем внутренний класс и объявляем его поля/методы приватными, они все равно доступны напрямую из внешнего класса. Есть ли способ скрывать поля и методы внутренних классов от внешних?
0
|
20.12.2015, 23:53 | |
Ответы с готовыми решениями:
18
Внутренние классы Внутренние классы Внутренние классы Внутренние классы |
1 / 1 / 0
Регистрация: 18.12.2015
Сообщений: 17
|
|
21.12.2015, 00:17 | 2 |
нет, думаю здесь был бы уместен вопрос так ли это необходимо ?
0
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
|
|
21.12.2015, 00:30 [ТС] | 3 |
Мне это не шипко необходимо, т.к. программа не очень большая. Но просто дело в том, что когда мы создаем объект, то хотим, чтобы у него был интерфейс, который позволяет взаимодействовать с объектом, посылать объекту сообщения, и скрытая часть, чтобы объект хранил свое состояние и внутренние механизмы поведения. А тут эта логика оказывается нарушена. Можно например случайно прочитать поле напрямую а не через метод, который при этом меняет состояние объекта, и получить труднообнаружимую ошибку.
0
|
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
21.12.2015, 00:54 | 4 |
Arvien, когда программист пишет внутренний класс, он имеет в виду что функционал этого класса тесно связан с внешним классом то есть оба класса делают одно итоже \ дополняют друг друга. Разделение обычно происходит больше из-за удобства. Таким образом нет смысла скрывать внутреннюю имплементацию вложенного класса. Если это не ваш случай, значит вы ошиблись когда делали класс внутренним.
0
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
|
|
21.12.2015, 02:23 [ТС] | 5 |
Есть еще одна возможность ) Мб я просто не программист! )))
0
|
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
21.12.2015, 11:09 | 6 |
0
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
|
|
21.12.2015, 23:23 [ТС] | 7 |
В таком случае у меня вопрос, касающийся правил хорошего тона в программировании на Java. Добиться того, чего я хочу можно, создав пакет с одним публичным классом, а все классы, которые были описаны как внутренние для этого класса, вытащить и сделать видимыми только на уровне пакета. И так поступить со всеми классами, которые у меня содержали внутренние классы (переделать их в пакеты). Стоит ли так делать? Получатся пакеты, состоящие из небольшого числа классов, публичный из которых только один. Это нормальная практика, или нужно просто в одном пакете лепить классы, пока свалка не станет слишком большой?
0
|
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
21.12.2015, 23:45 | 8 |
Arvien, лучше скажите какую задачу вы пытаетесь решить используя вложенные классы
0
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
|
|
22.12.2015, 02:04 [ТС] | 9 |
Именно сами вложенные классы мне не нужны. Я пытаюсь понять, как мне правильно структурировать проект. В моем представлении его структура должна быть иерархична. Т.е. когда я пишу класс, который решает сложную задачу, и у меня в процессе написания кода возникает необходимость разбить эту задачу на подзадачи, то я хочу, чтобы описание классов, которые я создаю для этого, были скрыты. Я хочу создать самодостаточную единицу, ответственную за решение определенной задачи, а все, что она для этого делает, должно быть скрыто внутри. Должен получиться черный ящик, предоставляющий интерфейс для взаимодействия с собой, и прячущий реализацию. Я предполагал, что вложенные классы для того и существуют, чтобы составить сложный объект из простых, спрятав описание этих объектов внутри. Но оказывается это не так. Т.к. содержимое внутренних классов полностью доступно внешним, то внутренние классы получаются уже не объектами. Возникает обычная каша, в которой ответственность за то чтобы не залезть не туда и не сделать не то ложится на плечи программиста и апеллирует к его внимательности. Вот я и пытаюсь понять, как же тогда мне создавать эти независимые единицы.
Добавлено через 13 минут Обычная композиция для решения этой задачи не подходит. Хотя мы собираем объект из более простых, описание всех этих объектов как бы вываливается наружу. В итоге глядя на проект сложно понять что там и для чего существует. Огромное количество классов, отвечающих за решение совершенно разных задач, просто свалено в кучу. Ни о какой иерархии тогда речи не идет и структура проекта совершенно не ясна.
0
|
1 / 1 / 0
Регистрация: 18.12.2015
Сообщений: 17
|
||||||
22.12.2015, 02:28 | 10 | |||||
для этого обычно структуру которую необходимо инкапсулировать помещают в отдельный файл, таким образом из вне будет доступен интерфейс только public класса
0
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
|
|
22.12.2015, 03:44 [ТС] | 11 |
К сожалению нет =( Классы без модификатора public будут доступны из других файлов этого же пакета. Чтобы их скрыть надо создавать отдельный пакет. Тогда действительно снаружи будет доступен только public класс. Но что, если внутри пакета мне надо скрыть реализацию одного из классов? Я уже получается не могу этого сделать, ведь если я создам еще один пакет, где этот класс будет public, а остальные нет, то подключить этот пакет сможет кто угодно, а не только мой первый пакет. А значит я уже не смогу полностью поменять реализацию этого вспомогательного пакета, потому что если им теоретически можно воспользоваться, то нет гарантий, что кто-то другой им не пользовался и его код не крашнется, если я полностью изменю поведение паблик класса либо его интерфейс. Кошмар какой-то.
0
|
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
22.12.2015, 09:02 | 12 |
Arvien, у вас какая то паранойа. Ненадо городить вложенные классы. Если хотите создать логическую единицу которая решает некую задачу, напишите это решение и запакуйте в jar. Затем этот джар можно импортировать в любой проект, там где нужно будет пользоватся этой либой. Внутри джара разделяйте классы на пакеты если это нужно.
Пройдитесь по maven repository, скачайте оттуда джары и посмотрите как они устроенны.
0
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
|
|
22.12.2015, 22:33 [ТС] | 19 |
KEKCoGEN, я уже не собираюсь городить внутренние классы, т.к. они не решают задачу, которая мне необходима. Пакеты тоже не решают ее. Почему? Я уже написал выше.
Долго гуглил. К сожалению, на java то что мне нужно вообще не может быть сделано. Не для того чтобы устроить тут холивар, но я проверил, как дела с внутренними классами обстоят в С#, в силу большого сходства этих языков. Там все в порядке: приватные члены внутреннего класса не доступны внешнему классу. Зависть ((( Я прочитал про внутренние классы множество статей и пару глав посвященных им в книгах по java, но ни разу не встретил упоминания о том, что приватные поля внутреннего класса доступны внешнему. А мне бы очень хотелось понять, зачем это вообще может быть нужно. Какой логикой руководствовались создатели языка, когда принимали такое антиинтуитивное решение, которое лично у меня вызывает глубокое разочарование в языке.
0
|
22.12.2015, 22:33 | |
22.12.2015, 22:33 | |
Помогаю со студенческими работами здесь
19
Внутренние классы и наследование Внутренние классы и интерфейсы Внутренние классы и Говорящие часы Внутренние классы. Разобраться с областью видимости Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |