it-swarm-tr.com

Java'da bir nesne oluşturmanın farklı yolları nelerdir?

Geçen gün bir iş arkadaşınızla konuştuk.

Bir yapıcı kullanmanın açık olduğu açıktır, ancak orada başka yolları nelerdir?

173
Mike Deck

Java'da nesne oluşturmanın dört farklı yolu vardır:

A. new anahtar sözcüğünü kullanarak
Bu, Java'da bir nesne oluşturmanın en yaygın yoludur. Bu şekilde nesnelerin neredeyse% 99'u oluşturulur.

 MyObject object = new MyObject();

B. Class.forName() kullanarak
Sınıfın ismini biliyorsak & eğer genel bir varsayılan kurucumuz varsa, bu şekilde bir nesne yaratabiliriz.

MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();

C. clone() kullanarak
Clone (), mevcut bir nesnenin kopyasını oluşturmak için kullanılabilir.

MyObject anotherObject = new MyObject();
MyObject object = (MyObject) anotherObject.clone();

D. object deserialization kullanarak
Nesnenin seri hale getirilmesi, serileştirilmiş formundan bir nesne yaratmaktan başka bir şey değildir.

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();

Onları burada adresinden okuyabilirsiniz.

282
kamaci

Çeşitli yollar var:

  • Class.newInstance aracılığıyla.
  • Constructor.newInstance aracılığıyla.
  • Seriyi kaldırma yoluyla (en türevlenemeyen temel sınıfın args no yapıcısını kullanır).
  • Object.clone aracılığıyla (yapıcı çağırmaz).
  • JNI aracılığıyla (bir kurucu çağırmalı).
  • Sizin için new çağıran başka bir yöntemle.
  • Sınıf yüklemesini yeni nesneler (örneğin, interned Strings) oluşturmak olarak tanımlayabilirsiniz.
  • Bir bildirgede başlatmanın bir parçası olarak değişmez bir dizi (diziler için kurucu yok).
  • Bir "varargs" (...) yöntem çağrısındaki dizi (diziler için yapıcı yok).
  • Derleme yapmayan zaman sabiti dizesi birleştirme (tipik bir uygulamada en az dört nesne üretir).
  • Çalışma zamanı tarafından oluşturulan ve atılan bir istisnaya neden olmak. Örneğin throw null; veya "".toCharArray()[0].
  • Oh, ve elbette, ilkellerin boksu (önbelleklenmemişse).
  • JDK8, örtük olarak nesnelere dönüştürülen lambdalara (özlü olarak özlü anonim iç sınıflara) sahip olmalıdır.
  • Tamamlanması için (ve Paŭlo Ebermann), new anahtar kelimesi ile de bazı sözdizimleri vardır.
67

Java dili içinde, bir nesneyi yaratmanın tek yolu açıkça veya dolaylı olarak yapıcısını çağırmaktır. Yapıcı yöntem çağrısında yansıma sonuçlarını kullanarak, seri kaldırma işlemi yapıcı çağırmak için yansıma kullanır, fabrika yöntemleri asıl yapıyı soyutlamak için çağrıyı kurucuya sarır ve klonlama benzer şekilde sarılmış bir kurucu çağrıdır.

25
Confusion

Evet, yansıma kullanarak nesneler oluşturabilirsiniz. Örneğin, String.class.newInstance() size yeni bir boş String nesnesi verecektir.

13
Thomas Lötzer

Java'da bir nesne oluşturmanın beş farklı yolu vardır,

1. new anahtar sözcüğünü kullanarak → yapıcı çağrılır

Employee emp1 = new Employee();

2. newInstance()Class yöntemini kullanarak __ → constructor çağrılır

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                                .newInstance();

Olarak da yazılabilir.

Employee emp2 = Employee.class.newInstance();

3. newInstance()Constructor yöntemini kullanarak __ → constructor çağrılır

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

4. clone() yöntemini kullanma → yapıcı çağrısı yok

Employee emp4 = (Employee) emp3.clone();

5. Serileştirme kullanımı → yapıcı çağrısı yok

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

İlk üç yöntem new anahtar sözcüğü ve her ikisi de newInstance() bir yapıcı çağrısı içerir, ancak daha sonra iki klonlama ve seri kaldırma yöntemi yapıcıyı çağırmadan nesneler oluşturur.

Yukarıdaki tüm yöntemlerin kendileriyle ilişkili farklı bayt kodları vardır, Okuma Örneklerle Java içinde nesne oluşturmanın farklı yolları örnekler ve daha ayrıntılı açıklama için örn. tüm bu yöntemlerin bayt kodu dönüşümü.

Bununla birlikte, bir dizi veya dize nesnesi oluşturmanın da nesneyi yaratmanın bir yolu olduğu söylenebilir, ancak bu şeylerin yalnızca bazı sınıflara özgü olduğunu ve doğrudan JVM tarafından işlendiğini, ancak bu 5 yöntemi kullanarak herhangi bir sınıfın nesnesini oluşturabileceğimizi söyleyebiliriz.

11
Naresh Joshi
9
Bill the Lizard

Normal örnek oluşturma mekanizmalarıyla yapılamayacak bir nesne türü vardır (çağrıcıları çağırmak): Arrays. Diziler ile oluşturulur

 A[] array = new A[len];

veya

 A[] array = new A[] { value0, value1, value2 };

Sean'ın bir yorumda söylediği gibi, bu, sözdizimsel olarak yapıcı çağrısına benzer ve dahili olarak, ayırmayı ve sıfır başlatmayı (veya ikinci durumda açık içerikle başlatmayı), bir bellek bloğunu, bazılarını da belirtmek için bir başlığa tipi ve uzunluğu.

Bir varargs yöntemine argümanları iletirken, bir dizi de örtük olarak oluşturulur (ve doldurulur).

Dördüncü bir yol olacak

 A[] array = (A[]) Array.newInstance(A.class, len);

Elbette klonlama ve seri kaldırma da burada işe yarıyor.

Standart API'de diziler oluşturan birçok yöntem vardır, ancak hepsi bu yollardan birini (veya daha fazlasını) kullanıyor.

6
Paŭlo Ebermann

Ayrıca kullanabilirsiniz

 Object myObj = Class.forName("your.cClass").newInstance();
6

Java’da yeniyseniz bu, her nesnenin Nesne’den devraldığı fark edilmelidir.

korumalı yerel Object clone (), CloneNotSupportedException;

6
stacker

Ayrıca, Verileri bir nesneye seri hale getirebilir . Bu, sınıf kurucusu üzerinden geçmiyor!


GÜNCELLENDI: Yorumunuzda bunu belirttiğiniz için teşekkürler Tom! Ve Michael ayrıca deneyler yaptı.

En türevlenemez seri hale getirilmiş üst sınıfın kurucusundan geçer.
Ve bu sınıfın hiçbir arg yapıcısı olmadığında, seri hale getirme işlemine InvalidClassException atılır.

Lütfen tüm vakaların tam bir tedavisi için Tom'un cevabına bakınız ;-)
Java’da "new" anahtar sözcüğünü kullanmadan nesne oluşturmanın başka bir yolu var mı

6
KLE

Ayrıntılı olmamızın başka yolları.

  • Oracle'da JVM, yapıcı çağırmadan bir örnek oluşturan Unsafe.allocateInstance () 'dir.
  • Bayt kodu manipülasyonunu kullanarak anewarray, multianewarray, newarray veya new kod ekleyebilirsiniz. Bunlar ASM veya BCEL gibi kütüphaneler kullanılarak eklenebilir. Oracle Java ile birlikte bir bcel sürümü gelir. Yine bu, yapıcı olarak adlandırılmaz, ancak yapıcıyı ayrı bir çağrı olarak çağırabilirsiniz.
5
Peter Lawrey

Yansıma aynı zamanda sizin için işi yapacak.

SomeClass anObj = SomeClass.class.newInstance();

sınıfın yeni bir örneğini oluşturmanın başka bir yoludur. Bu durumda, atılabilecek istisnaları da ele almanız gerekir.

4
ryanprayogo
  • new operatörünü kullanarak (böylece bir yapıcıyı çağırır)
  • yansıma clazz.newInstance() kullanarak (yine yapıcıyı çağırır). Veya clazz.getConstructor(..).newInstance(..) (yine bir yapıcı kullanarak, ancak hangisini seçebilirsiniz) ile

Cevabı özetlemek için - bir ana yol - nesne sınıfının kurucusunu çağırarak.

Güncelleme: Başka bir cevap kurucu kullanmayı içermeyen iki yolu listeledi - deseralizasyon ve klonlama.

4
Bozho

Yansıma:

someClass.newInstance();
4
John Meagher

Ayrıca mevcut nesneyi klonlayabilirsiniz (eğer Cloneable'i uygularsa).

Foo fooClone = fooOriginal.clone (); 
3
Roman

Java'da nesne oluşturmanın beş farklı yolu vardır:

1. `new` anahtar kelimesini kullanarak:

Java'da bir nesne oluşturmanın en yaygın yoludur. Bu şekilde nesnelerin neredeyse% 99'u oluşturulur.

MyObject object = new MyObject();//normal way

2. Fabrika Yöntemi Kullanarak:

ClassName ObgRef=ClassName.FactoryMethod();

Örnek:

RunTime rt=Runtime.getRunTime();//Static Factory Method

3. Klonlama Konseptini Kullanarak:

clone() kullanarak, clone(), var olan bir nesnenin kopyasını oluşturmak için kullanılabilir.

MyObjectName anotherObject = new MyObjectName();
MyObjectName object = anotherObjectName.clone();//cloning Object

4. `Class.forName ()` kullanarak:

Sınıfın ismini biliyorsak & eğer genel bir varsayılan kurucuya sahipse, bu şekilde bir nesne yaratabiliriz.

MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance();

Örnek:

String st=(String)Class.forName("Java.lang.String").newInstance();

5. Nesnenin seri hale getirilmesini kullanma:

Nesnenin seri hale getirilmesi, serileştirilmiş formundan bir nesne oluşturmaktan başka bir şey değildir.

ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream );
MyObjectName object = (MyObjectNmae) inStream.readObject();
3

Yöntem 1

Yeni anahtar kelimenin kullanılması. Java'da bir nesne oluşturmanın en yaygın yoludur. Bu şekilde nesnelerin neredeyse% 99'u oluşturulur.

Employee object = new Employee();

Yöntem 2

Class.forName () kullanarak. Class.forName (), yansıma için yararlı olan class nesnesini verir. Bu nesnenin sahip olduğu yöntemler, sınıfı yazan programcı tarafından değil, Java tarafından tanımlanır. Her sınıf için aynılar. Bunun üzerine newInstance () işlevini çağırmak, size o sınıfın bir örneğini verir (yani callingClass.forName ("ExampleClass"). NewInstance (), üzerinde sınıfın tanımladığı yöntemleri çağırabileceğiniz new ExampleClass () öğesini çağırmaya eşdeğerdir, görünür alanlara erişme vs.

Employee object2 = (Employee) Class.forName(NewEmployee).newInstance();

Class.forName () her zaman arayanın ClassLoader öğesini kullanır, ClassLoader.loadClass () ise farklı bir ClassLoader belirtebilir. Class.forName öğesinin yüklü sınıfı da başlattığına inanıyorum, ancak ClassLoader.loadClass () yaklaşımı bunu hemen yapmadı (ilk kez kullanılıncaya kadar başlatılmadı).

Başka bir okumalısınız:

Java: Örnekle İş parçacığı Durumu Giriş Basit Java Enum Örneği

Yöntem 3

Klonu kullanma (). Clone (), mevcut bir nesnenin kopyasını oluşturmak için kullanılabilir.

Employee secondObject = new Employee();
Employee object3 = (Employee) secondObject.clone();

Yöntem 4

NewInstance () yöntemini kullanma

Object object4 = Employee.class.getClassLoader().loadClass(NewEmployee).newInstance();

Yöntem 5

Nesne Serileştirme Kullanımı. Nesne Serileştirme, serileştirilmiş formundan bir nesne oluşturmaktan başka bir şey değildir.

// Create Object5
// create a new file with an ObjectOutputStream
FileOutputStream out = new FileOutputStream("");
ObjectOutputStream oout = new ObjectOutputStream(out);

// write something in the file
oout.writeObject(object3);
oout.flush();

// create an ObjectInputStream for the file we created before
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("crunchify.txt"));
Employee object5 = (Employee) ois.readObject();
2
Andriya

Bir API kullanıcısı perspektifinden, kuruculara bir başka alternatif statik fabrika yöntemleridir (BigInteger.valueOf () gibi), ancak API yazarı için (ve teknik olarak "gerçek") nesneler hala bir kurucu kullanılarak yaratılır.

0
Fabian Steeg