The klonování objektu je způsob, jak vytvořit přesnou kopii objektu. Ke klonování objektu se používá metoda clone() třídy Object.
The java.lang.Klonovatelné rozhraní musí být implementováno třídou, jejíž objektový klon chceme vytvořit. Pokud neimplementujeme rozhraní Cloneable, vygeneruje metoda clone(). CloneNotSupportedException .
The metoda clone(). je definován ve třídě Object. Syntaxe metody clone() je následující:
protected Object clone() throws CloneNotSupportedException
Proč používat metodu clone()?
The metoda clone(). ušetří další úlohu zpracování pro vytvoření přesné kopie objektu. Pokud to provedeme pomocí klíčového slova new, zabere to spoustu času zpracování, proto používáme klonování objektů.
Výhoda klonování objektů
Ačkoli má Object.clone() určité problémy s návrhem, stále je to oblíbený a snadný způsob kopírování objektů. Následuje seznam výhod použití metody clone():
- Nemusíte psát dlouhé a opakující se kódy. Stačí použít abstraktní třídu s metodou clone() o délce 4 nebo 5 řádků.
- Je to nejjednodušší a nejefektivnější způsob kopírování objektů, zvláště pokud jej aplikujeme na již rozpracovaný nebo starý projekt. Stačí definovat nadřazenou třídu, implementovat do ní Cloneable, poskytnout definici metody clone() a úkol bude hotový.
- Clone() je nejrychlejší způsob kopírování pole.
Nevýhoda klonování objektů
Níže je uveden seznam některých nevýhod metody clone():
- Abychom mohli použít metodu Object.clone(), musíme změnit mnoho syntaxí našeho kódu, jako je implementace rozhraní Cloneable, definování metody clone() a zpracování CloneNotSupportedException a nakonec volání Object.clone() atd.
- Musíme implementovat klonovatelné rozhraní, zatímco v něm nejsou žádné metody. Musíme ho použít k tomu, abychom JVM řekli, že na našem objektu můžeme provést clone().
- Object.clone() je chráněný, takže musíme poskytnout vlastní clone() a nepřímo z něj volat Object.clone().
- Object.clone() nevyvolá žádný konstruktor, takže nad konstrukcí objektu nemáme žádnou kontrolu.
- Pokud chcete napsat metodu clone v podřízené třídě, pak všechny její nadtřídy by v nich měly definovat metodu clone() nebo ji zdědit od jiné nadřazené třídy. Jinak řetězec super.clone() selže.
- Object.clone() podporuje pouze mělké kopírování, ale pokud potřebujeme hluboké klonování, budeme jej muset přepsat.
Příklad metody clone() (klonování objektů)
Podívejme se na jednoduchý příklad klonování objektů
class Student18 implements Cloneable{ int rollno; String name; Student18(int rollno,String name){ this.rollno=rollno; this.name=name; } public Object clone()throws CloneNotSupportedException{ return super.clone(); } public static void main(String args[]){ try{ Student18 s1=new Student18(101,'amit'); Student18 s2=(Student18)s1.clone(); System.out.println(s1.rollno+' '+s1.name); System.out.println(s2.rollno+' '+s2.name); }catch(CloneNotSupportedException c){} } }Otestujte to hned
Output:101 amit 101 amitstáhněte si příklad klonování objektů
Jak můžete vidět na výše uvedeném příkladu, obě referenční proměnné mají stejnou hodnotu. Clone() tedy zkopíruje hodnoty objektu do jiného. Takže nepotřebujeme psát explicitní kód, abychom zkopírovali hodnotu objektu do jiného.
Pokud pomocí nového klíčového slova vytvoříme další objekt a tomuto objektu přiřadíme hodnoty jiného objektu, bude to vyžadovat hodně zpracování na tomto objektu. Abychom tedy uložili extra úlohu zpracování, použijeme metodu clone().