2013-05-17 14 views
6

In uno dell'intervista java, la seguente questione viene domandato:oggetti istanziare senza utilizzare nuovo operatore

in Java è c'è un modo per un'istanza di un oggetto senza utilizzare new operatore? Gli ho risposto che non esiste un altro modo di creare un'istanza. Ma mi ha chiesto come viene istanziato un oggetto in java con le configurazioni in un file xml in java (in spring framework). Ho detto che internamente la molla usa reflection utils per creare un oggetto con un operatore new. Ma l'intervistatore non era convinto della mia risposta.

Ho visto this link essere utile ma esiste un operatore new indirettamente coinvolto nell'uno o nell'altro metodo interno.

C'è davvero un modo per creare un'istanza di oggetti in java senza utilizzare l'operatore new?

+0

È possibile creare un oggetto senza nuova attraverso: Riflessione/newInstance, clone() e (de) serializzazione . Sono sicuro che ce ne sono altri che non ho pensato. – Durandal

risposta

9

È possibile farlo utilizzando Java Reflection API. Ecco come funziona il DI framework di Spring (istanziando l'oggetto da xml).

Class<YourClass> c = YourClass.class; 
YourClass instance = c.newInstace(); 

Inoltre, Considerando enum essere un special class, le istanze della enum sono creati senza usare new Operator.

public enum YourEnum { X, Y } 
+1

Oops, ma @Arun ha detto: *. Ho detto che internamente la molla usa i reflection util per creare un oggetto con un nuovo operatore. * – Andremoniy

+0

Class theClass = Class.forName ("a.b.cYYClass"); YourClass c = (YourClass) theClass.newInstance(); – arcy

+0

@sanbhat: http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#newInstance() – Arun

1

È possibile utilizzare clone metodo per creare una copia dell'oggetto, senza nuovo operatore.

clone viene utilizzato per creare una copia dell'oggetto. Ci sono alcune cose che dovresti tenere a mente mentre usi il metodo clone di Object.

  • implementare l'interfaccia "Clonabile" per ogni classe che si desidera clonare. Se una classe non implementa l'interfaccia "Clonabile", il metodo clone genererà "CloneableNotSupportedException". Questa interfaccia non contiene alcun metodo. È solo un'interfaccia marcatore.

Esempio di classe String

String sample = new String(); 

Ora non abbiamo intenzione di utilizzare nuovo operatore e creeremo un nuovo oggetto

String sampleClone = sample.clone(); 

Altro è possibile utilizzare Class.forName()

public static Class forName (String className) genera ClassNotFoundException

Restituisce l'oggetto Classe associato alla classe o all'interfaccia con il nome di stringa specificato.

Esempio - Class exampleClass = Class.forName (yourtClass);

Leggi documentazione ufficiale

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName%28java.lang.String%29

+1

Ma immagino che questo sembra utilizzare internamente un nuovo operatore. http://javapapers.com/core-java/java-clone-shallow-copy-and-deep-copy/ – Arun

+0

@Arun clone crea una nuova istanza della stessa classe e copia tutti i campi nella nuova istanza e la restituisce . Non è scritto da nessuna parte che è internamente utilizzando un nuovo operatore. –

0

È possibile deserializzare un oggetto senza invocare nuova.

Ok, devi chiamare new su FileInputStream e ObjectInputStream, ma presumo che sia un uso corretto.

FileInputStream fis = new FileInputStream("myClassInstance.ser"); 
ObjectInputStream ois = new ObjectInputStream(fis); 
MyClass myObject = (MyClass)ois.readObject(); 
0

per quanto ne so, Class.newInstance() e Constructor.newInstance() non utilizzare internamente la parola chiave new.

Altri modi per creare un'istanza senza la nuova parola chiave:

  • Object.clone()
  • serializzazione
9

Un inizializzatore serie del seguente modulo non usa new esplicitamente.

int ia[][] = { {1, 2}, null }; 

Questo crea un oggetto ... da autoboxing:

Integer big = 9999; 

Infine, il seguente risultato nella creazione di oggetti da qualche parte nel ciclo di vita del programma :-)

Class c = ThisClass.class; 
String s = "a literal"; 
enum SomeEnum { WON, CHEW, TREE } 

(E ci sono molti, molti modi per farlo usando i metodi di libreria ... o il codice nativo)


Sotto le copertine, qualsiasi creazione di un nuovo oggetto in puro Java riguarda il bytecode new o uno dei 3 bytecode new array. Questo probabilmente include tutti i miei esempi.

È interessante notare che Object.clone() e ObjectInputStream.readObject() utilizzano entrambi meccanismi "magici" per la creazione di istanze che non implicano i bytecode precedenti e non chiamano i costruttori nel modo normale.

+0

Stephen C: Grazie per aver condiviso la tua opinione. – Arun

+0

@Arun - Potrei aver dimenticato anche altri casi ... –

5

vostra potrebbe utilizzare il senso del jdbc

Class.forName("YOURCLASSNAME").newInstance() 
1
import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.ObjectInputStream; 
    import java.io.ObjectOutputStream; 
    import java.io.Serializable; 

    public class ObjectCreateDifferentWays { 

     public static void main(String[] args) throws Exception { 
      ///1st Way with newInstance() 
      Class cls = Class.forName("Student"); 
      Student ob1 = (Student) cls.newInstance(); 
      ob1.display(); 

      ///2nd Way with new Operator 
      Student ob2 = new Student(); 
      ob2.display(); 

      //3rd Way with clone 
      Student ob3 = (Student) ob2.clone(); 
      ob3.display(); 


      //4th Way with Deserialization 
      FileOutputStream out = new FileOutputStream("file.txt"); 
      ObjectOutputStream obOut = new ObjectOutputStream(out); 
      obOut.writeObject(ob2); 
      obOut.flush(); 

      FileInputStream fIn = new FileInputStream("file.txt"); 
      ObjectInputStream obIn = new ObjectInputStream(fIn); 

      Student ob4 = (Student) obIn.readObject(); 
      ob4.display(); 
     } 
    } 


    class Student implements Cloneable, Serializable { 
     public void display() throws Exception { 
      System.out.println("Display "); 
     }@ 
     Override 
     protected Object clone() throws CloneNotSupportedException { 
      return super.clone(); 
     } 
    } 

Ci sono alcuni modi per creare oggetti in Java 1) newInstance() Metodo 2) nuovo operatore 3) clone() metodo 4) Deserializzazione

0

Esistono solo tre modi standard per creare un'istanza di una classe senza l'utilizzo del nuovo operatore e sono i seguenti:

  1. newInstance()
  2. clone()
  3. De-serializzazione
+0

Posso pensare ad almeno altri 2 modi ... oltre agli altri 5 modi mostrati come esempi nella mia risposta. Quindi il tuo * "ci sono solo tre modi standard" * è un po 'fuori luogo. –

Problemi correlati