Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
1

Внутренние классы (сокрытие реализации)

20.12.2015, 23:53. Показов 2413. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Когда мы создаем внутренний класс и объявляем его поля/методы приватными, они все равно доступны напрямую из внешнего класса. Есть ли способ скрывать поля и методы внутренних классов от внешних?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2015, 23:53
Ответы с готовыми решениями:

Внутренние классы
Здравствуйте! Увидел в философии Java пример похожий на этот (сюда пишу свой, принципиально от...

Внутренние классы
Всем привет! Есть такое задание: "1) Создайте класс MyLine. 2) Создайте внутренний класс...

Внутренние классы
Подскажите пожалуйста, решаю задачки с книги, хотелось бы проверить решение. Всё ли я сделала в...

Внутренние классы
Есть внутренний класс, в нём нужно получить ссылку на внешний. Как это можно сделать?

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
Эксперт Java
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
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
21.12.2015, 11:09 6
Цитата Сообщение от Arvien Посмотреть сообщение
Мб я просто не программист!
тогда не понятно почему вас вообще это интересует.
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
21.12.2015, 23:23  [ТС] 7
В таком случае у меня вопрос, касающийся правил хорошего тона в программировании на Java. Добиться того, чего я хочу можно, создав пакет с одним публичным классом, а все классы, которые были описаны как внутренние для этого класса, вытащить и сделать видимыми только на уровне пакета. И так поступить со всеми классами, которые у меня содержали внутренние классы (переделать их в пакеты). Стоит ли так делать? Получатся пакеты, состоящие из небольшого числа классов, публичный из которых только один. Это нормальная практика, или нужно просто в одном пакете лепить классы, пока свалка не станет слишком большой?
0
Эксперт Java
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 класса

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class A{
    private B b;
    public A(){
      b=new B();
    }
   
    public method...(){
        ...
        b.method1(); 
        ... 
    }
}
 
class B{
   int method1();
}
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
22.12.2015, 03:44  [ТС] 11
К сожалению нет =( Классы без модификатора public будут доступны из других файлов этого же пакета. Чтобы их скрыть надо создавать отдельный пакет. Тогда действительно снаружи будет доступен только public класс. Но что, если внутри пакета мне надо скрыть реализацию одного из классов? Я уже получается не могу этого сделать, ведь если я создам еще один пакет, где этот класс будет public, а остальные нет, то подключить этот пакет сможет кто угодно, а не только мой первый пакет. А значит я уже не смогу полностью поменять реализацию этого вспомогательного пакета, потому что если им теоретически можно воспользоваться, то нет гарантий, что кто-то другой им не пользовался и его код не крашнется, если я полностью изменю поведение паблик класса либо его интерфейс. Кошмар какой-то.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
22.12.2015, 09:02 12
Arvien, у вас какая то паранойа. Ненадо городить вложенные классы. Если хотите создать логическую единицу которая решает некую задачу, напишите это решение и запакуйте в jar. Затем этот джар можно импортировать в любой проект, там где нужно будет пользоватся этой либой. Внутри джара разделяйте классы на пакеты если это нужно.
Пройдитесь по maven repository, скачайте оттуда джары и посмотрите как они устроенны.
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.12.2015, 12:12 13
Java
1
2
3
4
5
class A {
    private static class B {
        int i = 42;
    }
}
поле i не будет видно из внешнего класса
я ответил на вопрос из начала этой бессмысленной темы?
0
Эксперт Java
4092 / 3826 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
22.12.2015, 12:45 14
Паблито, Как это не будет?
Java
1
2
3
4
5
6
7
8
9
class A {
    private static class B {
        int i = 42;
    }
 
    public static void main(String[] args) {
        new B().i = 213;
    }
}
Всё отлично компилируется
1
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.12.2015, 14:10 15

Не по теме:

вот черт, точно, не подумал



Добавлено через 1 час 19 минут
turbanoff, меня бомбануло
а если так?
Java
1
2
3
4
5
6
7
class Weird {
    interface I {
        class A {
            private int i = 42;
        }
    }
}
0
Эксперт Java
4092 / 3826 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
22.12.2015, 17:04 16
И всё равно будет доступен.
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.12.2015, 17:12 17
как?
это выше моего понимания, но очень интересно
0
Эксперт Java
4092 / 3826 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
22.12.2015, 17:29 18
Вроде всё как обычно. A - это обычный static inner class
Java
1
2
3
    public static void main(String[] args) {
        new I.A().i = 234;
    }
1
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 9
22.12.2015, 22:33  [ТС] 19
KEKCoGEN, я уже не собираюсь городить внутренние классы, т.к. они не решают задачу, которая мне необходима. Пакеты тоже не решают ее. Почему? Я уже написал выше.

Долго гуглил. К сожалению, на java то что мне нужно вообще не может быть сделано.

Не для того чтобы устроить тут холивар, но я проверил, как дела с внутренними классами обстоят в С#, в силу большого сходства этих языков. Там все в порядке: приватные члены внутреннего класса не доступны внешнему классу. Зависть (((

Я прочитал про внутренние классы множество статей и пару глав посвященных им в книгах по java, но ни разу не встретил упоминания о том, что приватные поля внутреннего класса доступны внешнему. А мне бы очень хотелось понять, зачем это вообще может быть нужно. Какой логикой руководствовались создатели языка, когда принимали такое антиинтуитивное решение, которое лично у меня вызывает глубокое разочарование в языке.
0
22.12.2015, 22:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2015, 22:33
Помогаю со студенческими работами здесь

Внутренние классы и наследование
Есть такая конструкция: /** * @author vvm28 */ class Parent{} public class...

Внутренние классы и интерфейсы
Добрый вечер! Решаю задачку из Эккеля по внутренним классам, реализующим интерфейсы. В трех разных...

Внутренние классы и Говорящие часы
package VnutrClass; import java.awt.*; import java.awt.event.*; import java.util.*; import...

Внутренние классы. Разобраться с областью видимости
Услышал такое утверждение: что внутренние классы видят все закрытые переменные не только класса в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru