Главная » Разработка для Android » Класс Object и его методы JAVA ДЛЯ ANDROID

0

 

Класс Java Object – Java. lang. Object – это корневой предок любого класса. Любой объект Java относится к классу Object. Если при определении класса не происходит автоматического указания суперкласса, то описываемыемый класс является прямым подклассом класса Object. Класс Object определяет стандартную реализацию для некоторых ключевых поведений, свойственных любому объекту. Если они не переопределяются суперклассом, то поведения наследуются непосредственно от класса Object.

Методы wait, noti fy и noti fyAl 1, относящиеся к классу Object, участвуют в поддержке параллелизма (concurrency support), реализованной в Java. Эти методы рассматриваются в подразделе «Управление потоками при помощи методов wait() и notify()» раздела «Идиомы программирования в Java» данной главы.

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

Реализация toString в классе Object возвращает не слишком полезную строку, которая основана на расположении объекта в куче. Переопределение toString в своем коде – хороший первый шаг к облегчению отладки кода.

Методы clone и finalіze можно назвать реликтами. Среда времени исполнения Java вызывает метод finalіze, только если он переопределяется в подклассе. Если же класс явно определяет finalіze, то он вызывается для объекта этого класса, но сразу же после этого объект подбирается сборщиком мусора. В Java не только нет однозначного ответа о том, когда это может произойти, но даже не гарантируется, что это вообще произойдет. Кроме того, вызов метода finalіze может восстановить объект! Фокус вот в чем: сборщик мусора подбирает объекты, к которым не идут живые ссылки. Однако реализация finalіze запросто создает новую живую ссылку, например добавляя финализируемый объект в какой-либо список! Поэтому существование метода finalize во многом препятствует оптимизации определяющего класса. Применяя при работе finalіze, вы приобретаете проблемы, не сопоставимые с возможным положительным эффектом.

Метод сlone создает объекты в обход конструкторов. Хотя clone и определяется применительно к Object, вызов его к объекту вызовет исключение, если только объект не реализует интерфейс Cloneable. Метод clone – это, в сущности, оптимизация, которая может быть полезна, если на создание объекта уходит существенное количество ресурсов. В то время как при умелом обращении clone может быть полезен в некоторых случаях, есть еще копирующий конструктор – принимающий существующий экземпляр в качестве единственного аргумента. Как правило, он действует гораздо более прямолинейно, и в большинстве случаев затратами на его использование можно пренебречь.

При помощи еще двух методов класса Object – hashCode и equals – «вызывающий» узнает, является ли вызываемый объект таким же, как и тот, с которым происходит сравнение.

При определении метода equals в документации по интерфейсам программирования приложений для класса Object оговаривается соглашение, которому должна подчиняться любая реализация метода equals. При корректной реализации метод equals имеет следующие атрибуты, и перечисленные ниже связанные с ними утверждения всегда должны выполняться:

Если х. equals (у) является истинным в любой момент жизненного цикла программы, то он всегда является истинным при условии, что значения х и у не изменяются.

Нужно постараться, чтобы все это сделать правильно, и все равно процесс может оказаться удивительно сложным. Обычная ошибка, нарушающая возвратность, – это определение нового класса, который иногда оказывается равен уже существующему классу. Предположим, программа использует существующую библиотеку, которая определяет класс EnglіshWeekdays. Теперь предположим, что вы дополнительно определяете класс FrenchWeekdays. Возникает очевидный соблазн определить для класса FrenchWeekdays метод equals, возвращающий true, сравнивающий один из элементов (дней) из класса EnglіshWeekdays с его французским эквивалентом. Не поступайте так! Имеющийся «английский» класс ничего «не знает» о том, что вы создали новый класс, поэтому никогда не распознает экземпляры нового класса как равные экземплярам старого. Вы нарушаете принцип возвратности!

Методы hashCode и equals необходимо воспринимать в паре: если вы переопределяете один из них, то переопределяйте и другой. Во многих библиотечных процедурах hashCode считается оптимизированным инструментом приблизительной оценки того, равны ли (equal) два объекта. Сначала в таких библиотеках сравниваются хеш-коды двух объектов. Если два кода отличаются, то библиотека полагает, что нет необходимости производить какие-то еще, более затратные сравнения, так как объекты определенно не равны. Но суть расчета хеш-кодов заключается в том, чтобы рассчитать что-то очень быстро, и это хорошо подходит для метода equals. Если необходимо проверить каждую ячейку в большом массиве, чтобы рассчитать хеш-код, то эта операция, вероятно, будет более длительной, чем точное сравнение. Другой крайностью является быстрый выход – возвращать 0, который будет единственным вариантом расчета хеш-кода. Это просто будет не слишком полезно.

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии