2010-10-01 20 views
2

J'ai la classe suivante:instanciation deux objets à l'intérieur d'une méthode pour l'utiliser comme «valeurs de retour de

public class Matriz 
{ 
    ... 
    static public void create(Matriz a, Matriz b) 
    { 
    ... 
    a=new Matriz(someValue,anotherValue); 
    b=new Matriz(someValue,anotherValue);  
    ... 
    } 
} 

Et dans ma méthode principale:

public static void main(String[] args) 
{ 
    Matriz a=null,b=null; 
    Matriz.create(a,b); 
    //these are null 
    a.print(); 
    b.print(); 
} 

Le point de ma méthode créer() est de "retourner" deux objets Matriz. Comment pourrais-je faire ça?

Répondre

2

La façon la plus simple est de revenir juste un tableau:

static public Matriz[] create() 
{ 
    ... 
    Matriz[] m = new Matriz[2]; 
    m[0] = new Matriz(someValue, anotherValue); 
    m[1] = new Matriz(someValue, anotherValue); 
    ... 
    return m; 
} 
2

Soit retourne un tableau des deux:

public static Matriz[] create(..) { 

    ... 
    return new Matriz[] {a, b}; 
} 

ou introduisons une nouvelle classe -

class MatrizPair { 
    private Matriz a; 
    private Matriz b; 

    // setter and getter for each 
} 

Il est Il est important de noter que votre exemple ne fonctionne pas parce que java est "pass-by-value", plutôt que "pass-by-reference" (lire this)

0

Vous ne pouvez pas renvoyer deux objets. Vous pouvez retourner uniquement un tableau ou une collection d'objets. Dans votre cas, vous pouvez faire des variables comme champs de classe et leur affecter quelque chose dans la méthode 'create'

1

Ce type de chose ne fonctionnera pas en Java, car Java appelle par valeur, et non par référence. Ce que vous pouvez faire si vous voulez cette fonctionnalité est de passer un conteneur de n'importe quel type à la méthode (un tableau, un Collection, un AtomicReference etc., mais vous ne pouvez pas le faire simplement en utilisant une variable. La variable est copiée lorsqu'elle est passée dans la méthode, donc la valeur d'origine ne peut pas être changée par la méthode Si vous passez un conteneur, vous pouvez insérer une valeur de la méthode, qui sera visible depuis le contexte d'origine points de méthode pour le même objet conteneur (les références sont copiées, mais les valeurs ne sont pas).

1

Tout d'abord, vous ne devriez pas être de passage dans les objets à instancier. il suffit de retourner un tableau.

donc votre code ressemblerait à ceci

public class Matriz 
{ 
    ... 
    static public Matriz[] create() 
    { 
    ... 
    a=new Matriz(someValue,anotherValue); 
    b=new Matriz(someValue,anotherValue);  
    ... 
    return new Matriz[] {a, b}; 
    } 
} 

Et votre principale méthode:

public static void main(String[] args) 
{ 
    Matriz[] array = Matriz.create(); 
    array[0].print(); 
    array[1].print(); 
} 
3

Voici quelques suggestions:

1) Retour une liste:

public List<Matriz> create(..); 
... 
List<Matriz> matrizList = Matriz.create(...); 
a = matrizList.get(0); 
b = matrizList.get(1); 

2) Renvoyer une méthode Objet

public MatrizHolder create(...); 
... 
MatrizHolder holder = Matriz.create(...); 
a = holder.getA(); 
b = holder.getB(); 

3) Créez-un à la fois

public Matriz create(...); 
... 
a = Matriz.create(..); 
b = Matriz.create(..); 

En aparté, vous ne pouvez pas passer une référence null à une méthode, il a initialisé dans une méthode et conserver la référence lorsque la méthode complète . Par conséquent, transmettre a et b à la méthode create dans votre code ci-dessus n'a pas de sens.

+0

+1 pour les créer un à la fois.On pourrait même utiliser le constructeur de la classe Matriz pour ça! Haleter! –