Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Аменяйте структуру классом

Читайте также:
  1. Аменяйте конструкцию enum классом
  2. Визначте структуру світогляду, його аспекти та рівні
  3. Как интегрировать группу управления в формализованную структуру Вашей организации
  4. КОМПЛЕКС СТИМУЛИРОВАНИЯ И ФАКТОРЫ,ОПР СТРУКТУРУ КОМПЛЕКСА
  5. Макет листовки должен учитывать фирменный стиль рекламируемого товара, содержать текст рекламного сообщения и иметь необходимую структуру.
  6. Науково-технічний прогрес та його вплив на територіальну й галузеву структуру продуктивних сил
  7. Нейтральный рН, поддерживающий здоровую структуру волос.
  8. Объединение процесса с основным классом
  9. Опишіть структуру правової культури.

 

Конструкция struct языка С не была принята в языке программирования Java потому, что класс выполняет все то же самое, что может делать структура, и даже более того. Структура группирует несколько полей данных в один общий объект, тогда как класс связывает с полученным объектом операции, а также позволяет скрывать поля данных от пользователей объекта. Иными словами, класс может инкапсулировать

 

 

encapsulate) свои данные в объекте, доступ к которому осуществляется только через его методы. Тем самым у разработчика появляется возможность менять внутреннее представление объекта (статья 12).

После первого знакомства с языком Java некоторые программисты, ранее пользо­вавшиеся языком С, приходят к заключению, что в некоторых случаях класс слишком тяжеловесен, чтобы заменить структуру, однако это не так. Вырожденный класс, состоящий исключительно из полей данных, примерно равнозначен структуре из языка С:

 

// Вырожденные классы, подобные этому,

// не должны быть открытыми!

class Point {

public float х;

public float у;

}

 

Поскольку доступ к таким классам осуществляется через поле данных, они лише­ны преимуществ инкапсуляции. Вы не можете поменять структуру такого класса, не изменив его API. Вы не можете использовать каких-либо инвариантов. Вы не можете предпринять каких-либо дополнительных действий, когда меняется значение поля. для программистов, строго придерживающихся объектно-ориентированного подхода, такой класс заслуживает осуждения, и в любом случае его следует заменить классом с закрытыми полями и открытыми методами доступа:

 

// Класс с инкапсулированной структурой

class Point {

private float х;

private float у;

public Point(float х, float у) {

this. х = х;

this.y = у;

}

public float getX() { return х; }

public float getY() { return у; }

public void setX(float х) { this.x = х; }

public void setY(float у) { this.y = у; }

}

 

В отношении открытых классов борцы за чистоту языка программирования совер­шенно правы: если класс доступен за пределами пакета, то предусмотрительный про­граммист создает соответствующие методы доступа, оставляя возможность изменения внутреннего представления этого класса. Если открытый класс показал клиенту свои поля данных, то всякая возможность менять это представление может быть потеряна, поскольку программный код клиентов открытого класса может оказаться где угодно.

 

 

 

Однако если класс доступен только в пределах пакета или является закрытым вложенным классом, то никакого настоящего ущерба от прямого доступа к его полям с данными не будет, при условии, что эти поля действительно описывают выстраивае­мую этим классом абстракцию. По сравнению с методами доступа такой подход созда­ет меньше визуального беспорядка и в декларации класса, и у клиентов, пользующихся этим классом. И хотя программный код клиента зависит от внутреннего представления класса, он может располагаться лишь в том же пакете, где находится класс. В том ред­ком случае, когда необходимо поменять внутреннее представление класса, изменения можно произвести так, чтобы за пределами пакета они никого не коснулись. В случае же с закрытым вложенным классом область изменений ограничена еще больше: внеш­ним классом.

Несколько классов в библиотеках для платформы Java нарушают совет, касающий­ся запрещения непосредственного доступа к полям открытого класса. В частности, это классы Point и Dimension из пакета java.awt. Не следует подражать этим классам, лучше рассматривать их как предупреждение. В статье 37 показано, как раскрытие внутреннего содержания класса Dimension привело к серьезным проблемам с произ­водительностью, которые нельзя было разрешить, не затрагивая клиентов.

 

 




Дата добавления: 2015-09-11; просмотров: 97 | Поможем написать вашу работу | Нарушение авторских прав

Переопределяя метод equals, всегда переопределяйте hashCode | Всегда переопределяйте метод toStrlng | Соблюдайте осторожность при переопределении метода Сlоnе | Подумайте над реализацией интерфейса ComparabIe | Сводите к минимуму доступность классов и членов | Предпочитайте постоянство | Предпочитайте компоновку наследованию | Проектируйте и документируйте наследование либо запрещайте его. | Предпочитайте интерфейсы абстрактным классам. | Используйте интерфейсы только для определения типов |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав