Если Вы не клонируете в Java затем, что Вы делаете и что Вы называете им?

Для Elasticsearch 6.x

Запрос: GET /foo/_search?pretty=true

Ответ: В Hits-> total укажите количество документов

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1001,
        "max_score": 1,
        "hits": [
          {
11
задан Michael Myers 6 July 2009 в 13:30
поделиться

8 ответов

Эффективная Java рекомендует любое из следующего:

  1. Конструктор копирования (как отметили другие):

    общедоступный элемент (элемент элемента)

  2. Метод фабрики копирования:

    public static Item newInstance (Item item)

(Также нет копирования для неизменяемых)

Основное отличие состоит в том, что с # 1 вы выбираете фактический класс результата, а с # 2 разработчик может вернуть подкласс . Семантика класса может помочь вам выбрать лучший.

16
ответ дан 3 December 2019 в 05:35
поделиться

Я бы назвал это методом копирования или конструктором копирования (в зависимости от обстоятельств). Если бы это был статический метод, я бы назвал его фабрикой.

С точки зрения того, что делать, наиболее гибким и долгоживущим вариантом является конструктор копирования. Это дает подклассам возможность копировать себя так же, как и родительский.

3
ответ дан 3 December 2019 в 05:35
поделиться

Вы можете перезаписать метод clone () -метод, если хотите. Другой используемый прием - конструктор, который принимает объект этого типа, например new ArrayList (anotherList) .

0
ответ дан 3 December 2019 в 05:35
поделиться

Я бы создал конструктор

...
public Thing(Thing copyFrom)
{
    attr1 = copyFrom.attr1;
    attr2 = copyFrom.attr2;
    //etc...
}

, а затем, когда вы захотите его клонировать

Thing copy = new Thing(copy from me);
2
ответ дан 3 December 2019 в 05:35
поделиться

У вас есть несколько вариантов, реализовать Cloneable , добавить конструктор копирования, но я предпочитаю использовать метод (статический или экземплярный) с именем, которое описывает, что делает операция копирования - глубокая или неглубокая копия и т. д.

0
ответ дан 3 December 2019 в 05:35
поделиться

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

  • Сделать ваши классы окончательными.
  • Сделать поля в ваших классах окончательными и закрытыми.

Например, вот "установщик" для неизменяемого трехмерного векторного объекта:

public Vector3D setX(double x) {
  return new Vector3D(x, this.y, this.z);
}

Итак, я предполагаю я говорю ... Я использую конструкторы копирования вместо мутации, и я просто называю их в соответствии с атрибутом, который я хочу изменить.

0
ответ дан 3 December 2019 в 05:35
поделиться

Это не самый лучший подход к копированию объектов, но следующий иногда полезно, если вы хотите выполнить глубокую копию объекта Serializable . Это позволяет избежать написания конструкторов копирования, реализации Cloneable или написания фабричных классов.

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);

//Serializes the input object
oos.writeObject(input);

ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);

//Copy of the input object
Object output = ois.readObject();

Не забывайте обрабатывать исключения и аккуратно закрывать потоки.

0
ответ дан 3 December 2019 в 05:35
поделиться

Другой вариант - реализовать метод копирования в исходном объекте , например:

interface Has3DCoords {
    void setLocation(double x, double y, double z);

    void copyCoordsTo(Has3DCoords dest);
}

Затем вы можете реализовать копирование с помощью такого фрагмента кода:

class Thing implements Has3DCoords {
    private Point3D loc;
    // ...

    void setLocation(double x, double y, double z) {
        loc.setLocation(x, y, z);
        // or: loc = new Point3D(x, y, z);
    }

    void copyCoordsTo(Has3DCoords dest) {
        loc.copyCoordsTo(dest);
        // or: dest.setLocation(loc.getX(), loc.getY(), loc.getZ());
    }

    OtherThing createOtherThing() {
        OtherThing result = new OtherThing();
        this.copyCoordsTo(result);
        return result;
    }
}

Это может быть полезно, если:

  • Клонировать весь объект не имеет смысла
  • Есть группа связанных свойств, которые часто копируются как одно целое
  • Вы не хотите раскрывать loc как свойство Thing
  • Количество свойств велико (или таких групп много), поэтому конструктор, который требует их всех в качестве параметров, будет громоздким.
0
ответ дан 3 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: