Клонирование с дженериками

Просто возьмите предмет по индексу 0 в array. См. Комментарии для более подробной информации:

//The initial data
var array = [{
    label: "1",
    value: "11"
  },
  {
    label: "2",
    value: "22"
  },
  {
    label: "3",
    value: "33"
  },
  {
    label: "4",
    value: "44"
  },
];

//Access the item you want by it's index in the array (0-based)
var firstItem = array[0];

//Grab the "value" property from the object
var value = firstItem.value;

//Log your value
console.log(value);

10
задан vaxquis 12 February 2015 в 13:29
поделиться

5 ответов

Я думаю, что текущий зеленый ответ плохой , почему вы можете спросить?

  • Он добавляет много кода
  • Он требует, чтобы вы перечислили все поля для копирования и сделать это
  • Это не будет работать для списков при использовании clone () (Это то, что говорит clone () для HashMap: возвращает неглубокую копию этого экземпляра HashMap: ключи и значения сами по себе не клонируются.) Так что вы в конечном итоге делаете это вручную (это заставляет меня плакать)

Да и между прочим сериализация - это тоже плохо, возможно, вам придется добавлять Serializable повсюду (это тоже заставляет меня плакать).

Итак, каково решение:

Библиотека глубокого клонирования Java Библиотека клонирования - это небольшая java-библиотека с открытым исходным кодом (лицензия apache), которая глубоко клонирует объекты. Объекты не обязательно должны реализовывать интерфейс Cloneable. Фактически, эта библиотека может клонировать ЛЮБЫЕ объекты Java. Его можно использовать, например, в реализациях кеширования, если вы не хотите, чтобы кэшированный объект изменялся или всякий раз, когда вы хотите создать глубокую копию объектов.

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);

Посмотрите на http://code.google.com/p/cloning/

10
ответ дан 3 December 2019 в 20:06
поделиться

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

Практически единственный способ сделать это - создать собственный интерфейс с public clone () метод (его не обязательно называть « clone () »). Вот пример из другого вопроса StackOverflow.

4
ответ дан 3 December 2019 в 20:06
поделиться

As you see, if a class tries to implement Cloneable and you want a deep clone, then all of your constituent objects needs to be immutable, primitive, or need to also be Cloneable.

Often, a better and easier approach is to create a copy constructor.

public class Scope<C extends Comparable<C>> implements Comparable<Scope<C>>, Serializable {
    private C starts;
    private C ends;
    public Scope(final Scope original) {
       starts = new C(original.starts);
       ends = new C(original.ends);
       // initialize all my other fields from "original"
    }
}

and of course you need a copy constructor on C that is capable of handling polymorphism.

If you have no access or ability to modify the source to C, then any method of copying, no matter what the method, will be very difficult and potentially impossible. For example, it is not possible to make a copy of an enum instance.

-1
ответ дан 3 December 2019 в 20:06
поделиться

Немного ОТ, но вы можете сэкономить много будущего в этом:

   catch (CloneNotSupportedException e) {
       throw new RuntimeException("Clone not supported", e);
   }

Чтобы при получении трассировки стека вы знали, какой объект вызвал проблему.

Ответить основной вопрос, ваш собственный интерфейс, который реализует public clone (), как написал mmyers, и требует, чтобы C также расширял это.

2
ответ дан 3 December 2019 в 20:06
поделиться

Как общий комментарий, по возможности избегайте использования Object.clone (). Если у вас есть контроль над соответствующим кодом, используйте вместо этого конструктор копирования. См. здесь для информации.

1
ответ дан 3 December 2019 в 20:06
поделиться
Другие вопросы по тегам:

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