Думай на Java

в электронном документе The Thinking


Решения предложенных упражнений содержатся в электронном документе The Thinking in Java Annotated Solution Guide (Думая на Java. Ответы на вопросы с комментариями), доступном за умеренную плату на сайте http://www.bruceeckel.com/.
  • Реализуйте дублирующие ссылки второго уровня. Создайте метод, который получает ссылку на объект, но при этом не изменяет этот объект, но вызывает другой метод, передает ему ссылку и этот второй метод изменяет объект.

  • Создайте класс myString, содержащий объект String, который вы инициализируете в конструкторе, используя параметр конструктора.  Добавьте метод toString() и метод concatenate(), который объединяет объект String с текстовой строкой. Наследуйте clone() в классе myString. Создайте два статических (static) метода, каждый из которых получает в качестве параметра ссылку myString x и вызывает x.concatenate("тест"), но во втором методе перед этим вызывается метод clone(). Проверьте работу обоих методов и укажите на различия в их работе.

  • Создайте класс Battery содержащий int, который является номером батареи (уникальный идентификатор). Сделайте его клонируемым и создайте для него метод  toString(). Затем создайте класс Toy, содержащий массив Battery и метод toString(), распечатывающий номера всех батареек. Напишите clone() для Toy, который автоматически клонирует все свои Battery объекты. Протестируйте его, клонируя Toy и распечатав результаты.

  • Модернизируйте код примера CheckCloneable.java таким образом, чтобы все методы clone() обрабатывали ситуацию CloneNotSupportedException перед тем как возвращать ее вызвавшим их методам.

  • Используя технологию изменяемых классов-компаньонов, создайте неизменный класс, содержащий int, double и массив char.

  • Модернизируйте код примера Compete.java, увеличив количество объектов в классах Thing2 и Thing4 и посмотрите, удастся ли вам определить как зависят задержки времени от их сложности, и является ли эта зависимость линейной или нет.

  • Модернизируйте код примера Snake.java, реализовав вариант глубокого копирования "змеи".



  • Наследуйте ArrayList и реализуйте в его методе clone() возможность глубокого копирования.

  • [79] В Си, где в основном работа происходит с данными малых объемов, по умолчанию осуществляется "передача по значению". Для Си такая форма весьма эффективна, но при работе с объектами эффективность "передачи по значению" значительно снижается. Кроме того, разработка классов с поддержкой "передачи по значению" на Си - весьма непростая задача.
    [80] Это слово вы не встретите в словаре английского (и русского) языка, но оно применяется в библиотеках Java, и поэтому включено сюда. Надеюсь что это не вызовет недоразумений.
    [81] В качестве контраргумента этому утверждению вы можете создать простой "пример". Например такой:
    public class Cloneit implements Cloneable {

        public static void main (String[] args)

       throws CloneNotSupportedException {

            Cloneit a = new Cloneit();

            Cloneit b = (Cloneit)a.clone();

        }

    }
    Однако, он будет работать лишь за счет того, что main() является методом класса Cloneit и, таким образом, имеет право вызывать защищенный метод базового класса clone(). Если вы попробуете осуществить этот вызов из другого класса, это неминуемо приведет к ошибке компиляции.
    [82] За исключением несчастного авокадо.
    [83] Си++ предоставляет программисту возможность по своему желанию перегружать операторы. Поскольку зачастую это весьма сложный процесс (см. раздел 10 книги Думая на Си++, 2-я редакция, Prentice-Hall, 2000), разработчики Java сочли что это "нежелательный элемент", который не должен применяться в Java. Однако они таки не реализовали это свое решение, и это не так уж плохо, поскольку в результате по иронии судьбы перегрузка операторов в Java использовать гораздо проще чем в Си++. Более подробную информацию вы найдете на сайте Python (www.Python.org), на котором хранится сборщик мусора и простые примеры перегрузки операторов.
    [84] Дуг Леа, который помогал при решении этой проблемы предложил мне такой выход, сказав что он просто создает функцию duplicate() для каждого класса.

    Содержание раздела