Для 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": [
{
Эффективная Java рекомендует любое из следующего:
Конструктор копирования (как отметили другие):
общедоступный элемент (элемент элемента)
Метод фабрики копирования:
public static Item newInstance (Item item)
(Также нет копирования для неизменяемых)
Основное отличие состоит в том, что с # 1 вы выбираете фактический класс результата, а с # 2 разработчик может вернуть подкласс . Семантика класса может помочь вам выбрать лучший.
Я бы назвал это методом копирования или конструктором копирования (в зависимости от обстоятельств). Если бы это был статический метод, я бы назвал его фабрикой.
С точки зрения того, что делать, наиболее гибким и долгоживущим вариантом является конструктор копирования. Это дает подклассам возможность копировать себя так же, как и родительский.
Вы можете перезаписать метод clone () -метод, если хотите. Другой используемый прием - конструктор, который принимает объект этого типа, например new ArrayList (anotherList) .
Я бы создал конструктор
...
public Thing(Thing copyFrom)
{
attr1 = copyFrom.attr1;
attr2 = copyFrom.attr2;
//etc...
}
, а затем, когда вы захотите его клонировать
Thing copy = new Thing(copy from me);
У вас есть несколько вариантов, реализовать Cloneable
, добавить конструктор копирования, но я предпочитаю использовать метод (статический или экземплярный) с именем, которое описывает, что делает операция копирования - глубокая или неглубокая копия и т. д.
Используйте неизменяемые структуры данных . Единственная причина, по которой вы чувствуете, что вам нужен clone ()
, - это то, что вы мутируете свои объекты на месте. Перестань. Подумайте о том, как вы можете:
Например, вот "установщик" для неизменяемого трехмерного векторного объекта:
public Vector3D setX(double x) {
return new Vector3D(x, this.y, this.z);
}
Итак, я предполагаю я говорю ... Я использую конструкторы копирования вместо мутации, и я просто называю их в соответствии с атрибутом, который я хочу изменить.
Это не самый лучший подход к копированию объектов, но следующий иногда полезно, если вы хотите выполнить глубокую копию объекта 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();
Не забывайте обрабатывать исключения и аккуратно закрывать потоки.
Другой вариант - реализовать метод копирования в исходном объекте , например:
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