Главная страница
Навигация по странице:

  • В чём разница между поверхностным и глубоким клонированием Как реализовать глубокое клонирование

  • Как сделать глубокое при помощи метода clone() и без неё

  • Почему метод clone() объявлен в классе Object, а не в интерфейсе Cloneable

  • Какие копии создаются методом clone() в Java по умолчанию

  • Ревью 5. Что такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4


    Скачать 110.73 Kb.
    НазваниеЧто такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4
    АнкорРевью 5
    Дата24.12.2022
    Размер110.73 Kb.
    Формат файлаdocx
    Имя файлаРевью 5.docx
    ТипДокументы
    #861326
    страница7 из 13
    1   2   3   4   5   6   7   8   9   10   ...   13

    Какой способ клонирования предпочтительней?


    Наиболее безопасным и, следовательно, предпочтительным способом клонирования является использование специализированного конструктора копирования:

    Отсутствие ошибок наследования (не нужно беспокоиться, что у наследников появятся новые поля, которые не будут склонированы через метод clone());

    Поля для клонирования указываются явно;

    Возможность клонировать даже final поля.

    В чём разница между поверхностным и глубоким клонированием? Как реализовать глубокое клонирование?


    Поверхностное копирование копирует настолько малую часть информации об объекте, насколько это возможно. По умолчанию, клонирование в Java является поверхностным, т.е. класс Object не знает о структуре класса, которого он копирует. Клонирование такого типа осуществляется JVM по следующим правилам:

    Если класс имеет только члены примитивных типов, то будет создана совершенно новая копия объекта и возвращена ссылка на этот объект.

    Если класс помимо членов примитивных типов содержит члены ссылочных типов, то тогда копируются ссылки на объекты этих классов. Следовательно, оба объекта будут иметь одинаковые ссылки.

    Глубокое копирование дублирует абсолютно всю информацию объекта:

    Нет необходимости копировать отдельно примитивные данные;

    Все члены ссылочного типа в оригинальном классе должны поддерживать клонирование. Для каждого такого члена при переопределении метода clone() должен вызываться super.clone();

    Если какой-либо член класса не поддерживает клонирование, то в методе клонирования необходимо создать новый экземпляр этого класса и скопировать каждый его член со всеми атрибутами в новый объект класса, по одному.

    Как сделать глубокое при помощи метода clone() и без неё?


    Нет необходимости копировать отдельно примитивные данные;

    Все классы-члены в оригинальном классе должны поддерживать клонирование. Для каждого члена класса должен вызываться super.clone() при переопределении метода clone();

    Если какой-либо член класса не поддерживает клонирование, то в методе клонирования необходимо создать новый экземпляр этого класса и скопировать каждый его член со всеми атрибутами в новый объект класса, по одному. Каждый класс в иерархии должен обязательно иметь свой переопределенный clone(), тогда большинство проблем можно решить просто используя super.clone().

    Еще один вариант клонирования объекта - это конструктор копирования. Создается конструктор, принимающий на вход объект того же класса, который необходимо клонировать:


    Почему метод clone() объявлен в классе Object, а не в интерфейсе Cloneable?


    Метод clone() объявлен в классе Object с указанием модификатора native, чтобы обеспечить доступ к стандартному механизму поверхностного копирования объектов. Одновременно он объявлен и как protected, чтобы нельзя было вызвать этот метод у не переопределивших его объектов. Непосредственно интерфейс Cloneable является маркерным (не содержит объявлений методов) и нужен только для обозначения самого факта, что данный объект готов к тому, чтобы быть клонированным. Вызов переопределённого метода clone() у не Cloneable объекта вызовет выбрасывание CloneNotSupportedException.

    Какие копии создаются методом clone() в Java по умолчанию?


    Object.clone() по умолчанию выполняет поверхностную копию.

    Как удалить директорию с файлами?


    Java не может удалять папки с данными в нем. Вы должны удалить все файлы перед удалением папки.

    Класс Files предоставляет два метода удаления.

    Метод delete(Path) удаляет файл или выдает исключение, если удаление не удается. Например, если файл не существует, NoSuchFileExceptionвыбрасывается a. Вы можете поймать исключение, чтобы определить, почему удаление не удалось, следующим образом:
    попробуйте {

    Files.delete (путь);

    } catch (NoSuchFileException x) {

    System.err.format("%s: такого нет" + "файл или каталог%n", путь);

    } catch (DirectoryNotEmptyException x) {

    System.err.format("%s не пустой%n", путь);

    } catch (IOException x) {

    // Здесь обнаруживаются проблемы с правами доступа к файлам.

    Система.ошибка.println(x);

    }

    Метод deleteIfExists(Path)также удаляет файл, но если файл не существует, исключение не создается. Автоматический сбой полезен, когда у вас есть несколько потоков, удаляющих файлы, и вы не хотите создавать исключение только потому, что один поток сделал это первым.
    1   2   3   4   5   6   7   8   9   10   ...   13


    написать администратору сайта