2012-08-17 11 views
19

è che possibile inizializzare l'oggetto direttamente come possiamo fare con classe String in Java:oggetto di inizializzazione direttamente in Java

come ad esempio:

String str="something..."; 

voglio fare lo stesso per la mia classe personalizzata:

class MyData{ 
public String name; 
public int age; 
} 

è che possibile, come

MyClass obj1={"name",24}; 

o

MyClass obj1="name",24; 

per inizializzare l'oggetto? o come può essere possibile!

+4

Come rendendo costruttori per l'oggetto? – CBredlow

+1

uhmm forse vuoi questo http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html :) –

+0

lo so con i costruttori, ma ogni modo alternativo è presente o no? –

risposta

0

È possibile con la parola chiave costruttori nuovi e in uso, ma non come String, che è un tipo di oggetto molto speciale.

+0

puoi dirmi il funzionamento della classe String, come lo fa !, quindi ho qualche idea da implementare per risolvere il mio problema. –

+0

Ad essere sincero non sono sicuro dell'implementazione interna, tuttavia è diverso perché ogni volta che crei un letterale String usando myString = "aString" in contrapposizione a myString = new String ("aString"), una nuova stringa viene allocata solo se e solo se non è già nel pool di stringhe Java. Questo pool di stringhe Java contiene tutti i valori letterali stringa che sono stati creati finora, quindi fa riferimento solo ai pool dal pool anziché creare ogni volta un nuovo oggetto String. –

29

Normalmente, si dovrebbe utilizzare un costruttore, ma non è necessario!

Ecco la versione del costruttore:

public class MyData { 
    private String name; 
    private int age; 

    public MyData(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    // getter/setter methods for your fields 
} 

che viene utilizzato in questo modo:

MyData myData = new MyData("foo", 10); 


Tuttavia, se i campi sono protected o public, come nel tuo esempio, si può fare senza che definisce un costruttore. Questo è il modo più vicino in java per quello che vuoi:

// Adding special code for pedants showing the class without a constuctor 
public class MyData { 
    public String name; 
    public int age; 
} 

// this is an "anonymous class" 
MyData myData = new MyData() { 
    { 
     // this is an "initializer block", which executes on construction 
     name = "foo"; 
     age = 10; 
    } 
}; 

Voilà!

+0

Non funziona. Non hai alcun costruttore 'MyData()' se hai definito un costruttore 'MyData (Nome stringa, int age)'. ** modifica: ** uhm ... Forse ho frainteso qui. Stai suggerendo di rimuovere completamente il costruttore? – aioobe

+1

@aioobe stai scherzando ... Ho pensato che le persone avrebbero effettivamente letto "senza un costruttore" nel senso di "senza un costruttore" .. cioè "definisci la tua classe senza un costruttore".jeez – Bohemian

+0

L'ho letto come "è possibile costruire un oggetto' MyData' senza utilizzare il suo costruttore "usando una sottoclasse anonima. Dato il tuo primo frammento, non sembrava funzionare per me. (Inoltre, stai * ancora * usando un costruttore. Resto fermo sul mio punto: non c'è modo di aggirare questo.) – aioobe

3

È necessario creare un metodo di costruzione per l'oggetto, che contiene i parametri dei campi per i quali si desidera valori.

Esempio:

public myClass(int age, String name) 
{ 
    this.age = age; 
    this.name = name; 
} 

Poi nella classe si desidera che questo:

myClass class = new myClass(24, "name"); 
0
class MyData{ 

    public MyData(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 
    public String name; 
    public int age; 
    } 

Quindi è possibile creare un'istanza la classe in questo modo:

MyData myData = new MyData("name", 24); 
+0

Mi sembra familiare ... – Bohemian

+0

la mia domanda è per: MyClass obj1 = {"nome", 24}; –

+1

quindi la risposta è no. Non puoi! – mabbas

4

Lo so con i costruttori, ma qualsiasi modo alternativo è presente o no?

No, non ci sono alternative alla costruttori.

Questa è fondamentalmente una delle garanzie fondamentali della lingua. Un oggetto non può essere costruito con altri mezzi se non attraverso i suoi costruttori e non esiste una sintassi alternativa al solito new ConstructorName(...).

L'idea più vicina che posso venire con sarebbe quello di avere un metodo factory statico chiamato dicono, mc:

class MyClass { 
    ... 
    public static mc(String name, int age) { 
     return new MyClass(name, age); 
    } 
} 

e poi fare

import static some.pkg.MyClass.mc; 

... 

MyClass obj1 = mc("name",24); 
+0

No so ... vedi la mia risposta – Bohemian

+0

Stai ancora attraversando un costruttore (e quindi devi scrivere 'new ConstructorName', che è quello che penso che l'OP vuole evitare). – aioobe

-1

Non c'è alternativa a costruttori (insieme con nuovo operatore) in java durante l'inizializzazione dell'oggetto. Hai menzionato come

String str = "qualcosa"

è possibile inizializzare stringa che modo, perché String è un letterale in Java. Solo i letterali possono essere inizializzati in questo modo. Un oggetto composito non può essere inizializzato, ma solo può essere istanziato con il nuovo operatore con i costruttori.

4

Se si dispone di una classe Persona:

public class Person { 

    private String lastName; 
    private String firstName; 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

} 

si può effettivamente creare un nuovo oggetto persona e inizializzare il suo nome e cognome con il seguente:

Person person = new Person(){{ 
    setFirstName("My FirstName"); 
    setLastName("MyLastName"); 
}} 

Questo viene utilizzato molto spesso durante la definizione Spring Configuration utilizzando il codice Java anziché la configurazione XML.

+2

Attenzione: in questo modo si sta effettivamente creando una classe interna anonima, non solo inizializzando un oggetto. [Vedere questa risposta] (http://stackoverflow.com/a/27521360/2600833) per una spiegazione di alcune potenziali insidie. initializatian – Nick

0
package com.company; 

public class InitializationOfObject { 
    int a ; 
    int b ; 

    InitializationOfObject(){ 
    } 

    InitializationOfObject(int r , int n){ 
     this.a = r; 
     this.b = n; 
     System.out.println("Object initialization by constructor "); 
    } 

    void methodInitialization(int k, int m){ 
     System.out.println("object initialization via method"); 
     this.a = k; 
     this.b = m; 
    } 

    void display(){ 
     System.out.println("k = " +a+ "m = "+b); 
    } 

    public static void main(String... arg){ 
     InitializationOfObject io = new InitializationOfObject(); 
     InitializationOfObject io2 = new InitializationOfObject(45,65); 
     io.a = io2.a; 
     io.b = io2.b; 
     io.display(); 

     io.methodInitialization(34,56); 
     io.display(); 

     io.a = 12; 
     io.b = 24; 
     System.out.println("object initialization via refrence"); 
     System.out.println("a = "+io.a+" "+ " b ="+io.b); 
    } 

} 

// Oggetto initializatian da construtor

k = 45m = 65 

oggetto dell'inizializzazione tramite metodo

k = 34m = 56 

oggetto di inizializzazione con riferimento

a = 12 b =24 
+0

oggetto con construtor k = 45m = 65 oggetto dell'inizializzazione tramite metodo k = 34m = 56 inizializzazione oggetto tramite refrence a = 12 b = 24 – charu

Problemi correlati