Программирование
<<  Практическое программирование на Java Многопоточное программирование на Java  >>
Эффективное программирование на Java
Эффективное программирование на Java
Эффективное программирование на Java
Эффективное программирование на Java
Часть 1. Методы генерации экземпляров
Часть 1. Методы генерации экземпляров
Выводы
Выводы
Часть 2. Вспомогательные классы
Часть 2. Вспомогательные классы
Выводы
Выводы
Часть 3. Устаревшие ссылки
Часть 3. Устаревшие ссылки
Выводы
Выводы
Часть 4. Метод Object
Часть 4. Метод Object
Часть 5. Переопределение Object
Часть 5. Переопределение Object
Когда переопределять метод
Когда переопределять метод
Реализация метода при наследовании
Реализация метода при наследовании
Реализация метода при наследовании
Реализация метода при наследовании
Реализация метода при наследовании
Реализация метода при наследовании
Часть 6. Переопределение Object
Часть 6. Переопределение Object
Часть 7. Проверка достоверности параметров метода
Часть 7. Проверка достоверности параметров метода
Выводы
Выводы
Autoboxing
Autoboxing
Возможности
Возможности
Часть 10
Часть 10
Последствия
Последствия
Картинки из презентации «Эффективное программирование на Java» к уроку информатики на тему «Программирование»

Автор: . Чтобы познакомиться с картинкой полного размера, нажмите на её эскиз. Чтобы можно было использовать все картинки для урока информатики, скачайте бесплатно презентацию «Эффективное программирование на Java.ppt» со всеми картинками в zip-архиве размером 2192 КБ.

Эффективное программирование на Java

содержание презентации «Эффективное программирование на Java.ppt»
Сл Текст Сл Текст
1Эффективное программирование на Java. 34boolean Object.equals(Object obj)
Андрей Дмитриев Февраль 2008. возвращает истину, если переданный объект
2Программа. Методы генерации равен исходному. Часто возникает
экземпляров. Вспомогательные классы. необходимость переопределить метод
Устаревшие ссылки. Метод equals() для того, чтобы гибко определять
Object.finalize(). Переопределение равенство объектов друг другу. По
Object.equals(). Переопределение умолчанию метод equals() возвращает истину
Object.equals() и hashCode(). Проверка только если ссылки равны.
достоверности параметров метода. Неявное 35Метод Object.hashCode(). Возвращает
создание объектов. Тип объекта. хеш-код (длинное целое число) экземпляра
Игнорирование исключений. класса. Возвращаемое значение используется
3Часть 1. Методы генерации экземпляров. для организации коллекций объектов
Следует рассматривать возможность созданий (HashMap, HashSet, HashTable).
экземпляров класса с помощью статических 36Соглашения для метода hashCode().
методов генерации. Возвращаемое значение hashCode() должно
4Пример использования. Class state { быть постоянным для данного объекта в
public state(){…}//конструктор //метод течение жизни приложения. Если два объекта
генерации public static state равны (equals() возвратил true), то методы
createdefaultstate(){…} } … hashCode() двух объектов должны вернуть
//использование state state = new state(); одно и то же значение. Если два объекта не
state newstate = равны (equals() возвратил false), то
state.Createdefaultstate(); методы hashCode() двух объектов могут
5Пример использования (JDK). public вернуть одно и то же значение.
static Boolean valueOf(boolean b){ return 37Устройство хеш-таблицы. Коллекции
(b?Boolean.TRUE:Boolean.FALSE); }. данных распределяют содержимое на основе
6Недостатки. Если конструктор спрятан, их хеш-кода. Поиск вхождения в коллекцию
то создать подкласс нельзя: классы, не данных производится в том числе на основе
имеющие открытых (или защищенных) хеш-кода.
конструкторов, не могут иметь подклассов. 38Два класса: ключ и значение. class
Статический метод трудно отличим от других CarId { int carId; CarId(int n) { carId =
методов класса. Если использовать n; } } class CarModel { String model;
соглашения (valueOf(), getInstance() и public CarModel(String model){ this.model
т.д.), то видимость улучшается. = model; } public String toString(){return
7Преимущества. В отличие от model;} }.
конструктора, имеет название, которое 39Результат работы с таблицей. Несмотря
более точно отражает предназначение. Не на то, что в таблицу была помещена машина
обязан при вызове создавать новый объект. с номером три, поиск ее не находит.
Имеет право вернуть не только сам объект HashMap hm = new HashMap(); hm.put(new
данного класса, но и любой его подтип. CarId(1), new CarModel("lada"));
8Выводы. И конструкторы, и статические hm.put(new CarId(2), new
методы генерации имеют свои области CarModel("mazda")); hm.put(new
лучшего применения. CarId(3), new
9Часть 2. Вспомогательные классы. CarModel("volvo")); hm.put(new
Иногда приходится создавать классы, CarId(4), new CarModel("wv"));
целиком состоящие из статических методов. System.out.println("hm = " + hm
Основное предназначение – предоставлять + "\n"); CarId newCar = new
некоторую функциональность для других CarId(3); if(hm.containsKey(newCar))
классов. System.out.println((CarModel)hm.get(newCar
10Пример использования. Class util { ); else { System.out.println("Key not
public static int sign(int v){…} public found: " + newCar); } }.
static boolean translatevalue (boolean a, 40Модифицированный класс-ключ.
boolean b){…} … } … //использование int z Переопределение двух указанных методов
= util.Sign(value); boolean b = решает проблему. class CarId2 { int carId;
util.Translatevalue(value1, value2); CarId2(int n) { carId = n; } public int
11Альтернативное использование. Данный hashCode() { return carId; } public
конструктор называется конструктор по boolean equals(Object o) { return (o
умолчанию. Он создается, если instanceof CarId2) && (carId ==
пользователем не был объявлен ни один из ((CarId2)o).carId); } }.
конструкторов. Использование экземпляров 41Рекомендации по реализации hashCode().
данного класса нарушает единство Цель: достичь уникальности значения для
функциональности. Класс-наследник будет различных объектов: Неизменяемый объект
работать со вспомогательными методами как может запоминать свой хеш-код в поле.
с обычными методами экземпляра. Util public int hashCode(){ int result = 17;
myUtil = new Util(); result = 37 * result + field1; result = 37
12Абстрактный класс. Объявление класса * result + field2; return result; }.
Util абстрактным – неудачное решение: 42Выводы. Рекомендуется переопределять
Наследник Util может все равно быть методы equals() и hashCode() одновременно.
создан. Путаница ввиду того, что Неудачный выбор хеш-функции может
абстрактность предполагает использование повредить производительности работы со
класса в будущем. структурами данных. Различные объекты,
13Закрытый конструктор. Объявление имеющие одинаковые хеш-коды, в коллекции
закрытого конструктора позволяет будут организованы во вспомогательный
предотвратить создание конструктора по список.
умолчанию: Кроме того, невозможно создать 43Часть 7. Проверка достоверности
наследника класса Util ввиду того, что параметров метода. Большинство методов и
конструктор закрыт. class Util { private конструкторов имеют ограничения на
Util(){} … }. передаваемые параметры. Игнорирование
14Выводы. Предотвращение создания некорректных параметров откладывает
экземпляров можно осуществить через обнаружение ошибки.
перекрытие конструктора. 44Пример: проверка параметра. /** …
15Часть 3. Устаревшие ссылки. @return … @throws IOException, if …
Автоматическая сборка мусора освобождает @throws IllegalArgumentException, if … */
от необходимости заботиться об удалении public int readBytes(InputStream is){ if
объектов. Тем не менее, в некоторых (is == null) { throw new IOException(…);
случаях рекомендуется явно удалять }…
объекты, необходимость в которых отпала. 45Важность проверок. Особенно важно
16Пример ситуации. Верхний элемент более проверять параметры, используемые не во
использоваться стеком не будет, однако время исполнения метода, а позже.
ссылка на него осталась в массиве. class 46Проверки. Для публичных методов все
Stack { public Object pop(){ if (size == проверки нужно документировать.
0) { throw …; } return elements[--size]; } Выбрасывание исключения – подходящая
… }. реакция на некорректный параметр. Для
17Реализация метода ensureCapacity(). скрытых методов можно использовать
Удаление ненужных ссылок может происходить утверждения (assert). В некоторых случаях
при увеличении размера стека: private void проверка параметров недопустима по
ensureCapacity(){ if (elements.length == соображениям производительности. В таком
size){ Object [] old = elements; elements случае проверку следует отложить.
= new Object[2*elements.length]; 47Выводы. Контроль передаваемых
System.arrayCopy(old, 0, elements, 0, параметров имеет важное значение для
size); }. поддержания работоспособности программы,
18Модификация метода pop(). Освобождение простоты обнаружения проблемы. Излишних
ссылки позволит сборщику мусора удалить ограничений лучше избегать: только
объект при необходимости. public Object действительно некорректные данные методам
pop(){ if (size == 0) { throw …; } Object позволительно изменять свое поведения в
retValue = elements[--size]; зависимости от параметров.
elements[--size] = null; return retValue; 48Часть 8. Неявное создание объектов.
}. Строки – неизменяемые (Immutable) объекты.
19Выводы. Обнуление ссылок позволяет Исполнение некоторых операций со строками
экономнее расходовать память. Побочный неявно порождает (промежуточные) строковые
эффект: генерирование исключения при объекты.
попытке разыменовать обнуленную ссылку. 49Пример: создание новой строки.
20Часть 4. Метод Object.finalize(). Следующая запись создает два объекта
Следует избегать использования метода вместо одного: String s = new String(“a
Object.finalize(). string”); Лучшее решение будет таким:
21Пример использования. Class String s = “a string”;
dbconnector { protected void finalize(){ 50Пример: объединение строк. Объединение
//некие завершающие действия } } … строк оператором «+» - немасштабируемое
//рекомендация запустить сборку мусора решение: Время, необходимое оператору «+»
runtime.Getruntime().Gc(); //рекомендация для объединения N строк, пропорционально
запустить финализацию объектов N*N. String s = “”; for (int i = 0; i <
runtime.Getruntime().Runfinalization(); N; i++){ s+=“”+i; }.
22Предназначение. В соответствии со 51Интенсивная работа со строками. Если
спецификацией, данный метод выполняется строка предполагает множественное
перед тем как объект будет удален из кучи изменение, то имеет смысл использовать
(heap). Спецификация не гарантирует его изменяемые объекты: java.lang.StringBuffer
вызова немедленно и даже в течение жизни Организует синхронный доступ к строке.
пользовательской программы. java.lang.StringBuilder Эффективнее, но
23Возможные ошибки. Внутри метода небезопасен для работы со многими
finalize() можно восстановить ссылку на потоками.
данный объект. Неполностью 52Другие неизменяемые объекты. Следующие
инициализированные объекты. Нарушение варианты использования конструкторов
целостности приложения. При возникновении Boolean b = new Boolean(false); Integer i
исключительной ситуации внутри метода = new Integer(10); Float f = new
finalize() возможно некорректное его Float(1.0); рекомендуется заменить на
исполнение. Ошибка OutOfMemoryError статические вызовы методов: public static
вследствие того, что ресурсы ожидают Boolean valueOf(boolean b); public static
освобождения внутри метода finalize(). Integer valueOf(int i); public static
24Когда finalize() может быть нужен. Для Float valueOf(float f);
вызова завершающего метода, если клиент 53Другие неизменяемые объекты (cont.).
забыл его вызвать. Для работы с ресурсами Например: Long ln = new Long(1000); Лучше
ОС через С/С++. заменить на Long ln = Long.valueOf(1000);
25Выводы. Рекомендуется создавать метод Замечание: данного подхода следует
для завершения работы с объектом и избегать в своих классах, если есть
заставлять клиентов его использовать необходимость в новом экземпляре объекта.
всякий раз. Интерфейс Disposable. Данный Ключ в таблице.
подход часто используется внутри блока 54Autoboxing. Для удобства написания
finally: try { doConnect(url); } finally { можно использовать автоматическую упаковку
doTermination(); }. примитивных типов в классы-оболочки:
26Выводы (cont.). Если приходится ArrayList<Integer> list = new
использовать метод finalize(), то нужно ArrayList<Integer>(); list.add(0,
связать его с методом предка: class 42); int total = list.get(0);
DBConnector { protected void finalize(){ 55Выводы. Если производительность имеет
try { //…. } finally { super.finalize(); } решающее значение, то использовать
}}. операторы конкатенации строк не
27Часть 5. Переопределение рекомендуется. Если допустимо,
Object.equals(). public boolean рекомендуется использовать статические
Object.equals(Object obj) возвращает фабрики неизменяемых классов вместо
истину, если переданный объект равен конструкторов.
исходному. Часто возникает необходимость 56Часть 9. Тип объекта. Для ссылки на
переопределить метод для того, чтобы гибко объект рекомендуется использовать более
определять равенство объектов друг другу. общий интерфейс, а не конкретный класс.
По умолчанию метод equals() возвращает 57Интерфейс как тип объекта. Например,
истину только если ссылки равны. Vector students = new Vector(); Лучше
28Реализация по умолчанию. Следует заменить на List students = new Vector();
оставить реализацию без изменений если: Не 58Возможности. Программа приобретает
предполагается сравнивать объекты; дополнительную гибкость. При изменении
Экземпляр класса внутренне уникален реализации программы достаточно поменять
(java.lang.Thread); Метод уже унаследован вызов конструктора на более подходящий.
от предка и этой реализации достаточно; 59Выводы. Имеет смысл предусмотреть
Класс закрыт от внешнего использования и возможность изменения фактического типа
никогда не будет вызван. объекта без необходимости изменять способ
29Когда переопределять метод. Если есть доступа к его данным. Возможная
понятие логической эквивалентности. Обычно модернизация или развитие кода.
это касается классов-значений: Integer, 60Часть 10. Игнорирование исключений.
Date и т.д. Декларирование исключения методом
30Плюс переопределения. Возможность указывает на необходимость предусмотреть
использовать классы-значения в качестве его обработку. Часто используется
ключей. игнорирование исключения или игнорирование
31Общие соглашения. Рефлексивность: специфики исключения.
x.equals(x) == true; Симметричность: 61Пример игнорирования. try {
x.equals(y) == y.equals(x); doConnect(url); } catch (ConnectException
Транзитивность: Если x.equals(y) == true и e) { //Пустой блок лишает смысла данное
y.equals(z) == true то x.equals(z) == исключение. }.
true; Непротиворечивость: последовательные 62Последствия. Игнорирование может
вызовы equals всегда возвращают одно и то привести программу в нежелательное
же значение, если объекты не меняются; состояние. При дальнейшей модификации кода
x.equals(null) всегда должно возвращать возникнет вопрос, почему данное исключение
false. не учитывается.
32Реализация метода при наследовании. Не 63Выводы. Рекомендуется ставить в блок
существует способа расширить класс, catch() нотификацию об исключении:
порождающий экземпляры, и добавить к нему журнализация, вывод, файловый вывод. Если
новый аспект, сохранив при этом соглашения нотификация не нужна: можно поместить
для метода equals(). Композиция классов комментарий, поясняющий причины отсутствия
позволяет обойти данное ограничение. обработчика пробросить исключение выше по
33Выводы. Переопределение метода стеку вызовов. try { doConnect(url); }
equals() требует соблюдения нескольких catch (ConnectException e) {
правил. При сравнении объектов классов, logger.info("message"); }.
образующих иерархию, придется отказаться 64Ссылки. Effective Java, J. Bloch.
от метода equals(). Рекомендуется 65Q&A.
переопределять также метод hashCode(). 66Спасибо! andrei.dmitriev@sun.com
34Часть 6. Переопределение Февраль 2008. Эффективное программирование
Object.equals() и hashCode(). public на Java.
Эффективное программирование на Java.ppt
http://900igr.net/kartinka/informatika/effektivnoe-programmirovanie-na-java-236228.html
cсылка на страницу

Эффективное программирование на Java

другие презентации на тему «Эффективное программирование на Java»

«История развития языков программирования» - Простая величина в каждый момент может иметь не более одного значения. Структурированная величина. Основные понятия. <переменная>:: = Запись эквивалентна метаформуле <переменная>::= А|В. Функция. Диаграмма состоит из основных символов или понятий языка. Информатика. Другая важная классификация величин - простые и структурированные.

«Операция в программировании» - Многопоточное программирование. Реализации критических секций. Задача об обедающих философах. Введение. Семафор. Задания-работники. Итеративный параллелизм. Справедливость Безусловная Слабая Сильная Безопасность Живучесть. Поиск максимума (1). Часть 1. Критическая секция. Рекурсивный параллелизм. Часть 3.

«Объект объектно-ориентированного программирования» - Метаклассы. Объекты. Полиморфизм. Классы. Уникальность. Поведение. Типы отношений между классами. Агрегация. Методология объектно-ориентированного программирования. Объектно-ориентированный подход обладает преимуществами. Слово "полиморфизм" греческого происхождения и означает "имеющий много форм".

«Классификация языков программирования» - Программа – отладчик; транслятор; библиотека стандартных программ и функций. Язык программирования Pascal относится к: Повтори классификацию языков программирования по степени детализации и способы записи алгоритмов. Системы программирования. Повтори способы записи алгоритма и виды программ переводчиков.

«Языки программирования» - Диаграмма состояний. Проблемно-ориентированный автоматный язык. Синтаксический анализатор. Навигация по коду. Интегрированная среда разработки. Автомат описывается в терминах автоматного программирования. Достоинства средства UniMod. Проблемно-ориентированные расширения существующих языков. Генерация диаграмм.

«Линейное программирование» - 3. В ячейках А11:А13 будем вычислять левые части ограничений в системе. В MS Excel 2007: 4) Кнопка Перейти (внизу окна Параметры Excel). Укажем ограничения 4) Нажимаем кнопку Добавить Появится окно Добавление ограничения. Данцигом в 1949 г. Третье ограничение. Решение задач линейного программирования в MS Excel.

Программирование

31 презентация о программировании
Урок

Информатика

130 тем
Картинки
900igr.net > Презентации по информатике > Программирование > Эффективное программирование на Java