Думай на Java

       

в Java широко используются ссылки


Поскольку в Java широко используются ссылки и поскольку каждый создаваемый объект создается в heap и становится мусором сразу же после того как перестает использоваться, поведение и манипуляция с объектом изменяется, особенно при передаче и возврате объектов. Например, в Си или Си++, если вы хотите инициализировать некоторые фрагменты памяти в методе, вы можете использовать для получения этого адреса получаемый методом параметр. Иначе вам пришлось бы беспокоиться на счет того, существует ли до сих пор необходимый вам объект или он был уничтожен. Поэтому интерфейс подобных методов несколько усложнен. Но в Java вы не должны волноваться о существовании объекта, за вас обо всем позаботятся. Вы можете создавать объекты тогда, когда вам захочется, не беспокоясь о самой механике создания объекта: вы просто передаете ссылку. Иногда такая простота практически незаметна, а иногда просто поражает.
За эти волшебные возможности от вас требуется учитывать следующие два момента:
  • Вам придется мириться с некоторой потерей производительности, связанной с управлением памятью (хотя она может быть весьма незначительной) и неопределенностью в скорости работы программы(поскольку при недостатке памяти может быть активирован сборщик мусора). Для большинства приложений выгоды превышают недостатки а наиболее узкие места можно обойти, используя native методы (см. Приложение B)

  • Дублирующие ссылки: иногда вы можете случайно столкнуться с возникновением двух ссылок на один и тот же объект, что может привести к негативным последствиям лишь в том случае, если обеим ссылкам присваиваются указатели на различные объекты. Вот где потребуется уделить более пристальное внимание и, там где это необходимо, использовать метод clone() для объекта, чтобы защититься от непредвиденных изменений. В качестве альтернативы, когда для для повышения эффективности целесообразно использовать дублирующие ссылки, вы можете применить неизменные объекты, которые могут возвращать объекты того же или иного типа, но не могут использоваться для изменения первоначального объекта, так что эти изменения не отразятся на дублирующих ссылках.

  • Некоторые люди считают что клонирование в Java плохо реализовано и при наследовании используют собственные версии клонирования [84] не пользуясь вызовом метода Object.clone(), что избавляет от необходимости наследования интерфейса Cloneable и перехвата CloneNotSupportedException. Это весьма подходящий прием, поскольку clone() весьма редко поддерживается в пределах стандартных библиотек Java, к тому же он довольно безопасен.

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