224 votes

Comment retourner 2 valeurs à partir d'une méthode Java ?

J'essaie de renvoyer deux valeurs à partir d'une méthode Java, mais j'obtiens ces erreurs. Voici mon code :

// Method code
public static int something(){
    int number1 = 1;
    int number2 = 2;

    return number1, number2;
}

// Main method code
public static void main(String[] args) {
    something();
    System.out.println(number1 + number2);
}

Erreur :

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - missing return statement
    at assignment.Main.something(Main.java:86)
    at assignment.Main.main(Main.java:53)

Java Résultat : 1

2 votes

Ce duplicata devrait-il être inversé ? La réponse ici semble meilleure.

282voto

Jesper Points 65733

Au lieu de renvoyer un tableau contenant les deux valeurs ou d'utiliser une fonction générique Pair pensez à créer une classe qui représente le résultat que vous voulez renvoyer, et renvoyez une instance de cette classe. Donnez à cette classe un nom significatif. Les avantages de cette approche par rapport à l'utilisation d'un tableau sont la sécurité des types et la facilité de compréhension de votre programme.

Note : Un générique Pair telle qu'elle est proposée dans certaines des autres réponses ici, vous offre également la sécurité de type, mais ne transmet pas ce que le résultat représente.

Exemple (qui n'utilise pas de noms vraiment significatifs) :

final class MyResult {
    private final int first;
    private final int second;

    public MyResult(int first, int second) {
        this.first = first;
        this.second = second;
    }

    public int getFirst() {
        return first;
    }

    public int getSecond() {
        return second;
    }
}

// ...

public static MyResult something() {
    int number1 = 1;
    int number2 = 2;

    return new MyResult(number1, number2);
}

public static void main(String[] args) {
    MyResult result = something();
    System.out.println(result.getFirst() + result.getSecond());
}

1 votes

C'est la solution que je préfère - on peut supposer que la paire de chiffres a une certaine signification, et il serait bien que le type de retour la représente.

4 votes

Vous pouvez utiliser SimpleEntry<type_de_valeur_1, type_de_valeur_2> de java.util.AbstractMap.SimpleEntry et l'utiliser avec getKey() pour obtenir l'objet 1 et getValue() pour obtenir l'objet 2

72 votes

Je suis convaincu que Java devrait vous permettre de renvoyer plusieurs valeurs. Ce serait plus rapide (moins d'objets créés) et ne nécessiterait pas de classes supplémentaires (code gonflé) chaque fois que l'on veut faire quelque chose d'un peu différent. Je ne vois pas d'inconvénients, peut-être quelqu'un peut-il m'éclairer ?

82voto

Matt Points 21690

Java ne prend pas en charge les retours à valeurs multiples. Renvoie un tableau de valeurs.

// Function code
public static int[] something(){
    int number1 = 1;
    int number2 = 2;
    return new int[] {number1, number2};
}

// Main class code
public static void main(String[] args) {
  int result[] = something();
  System.out.println(result[0] + result[1]);
}

14 votes

C'est presque toujours la mauvaise chose à faire, surtout si les types des deux valeurs de résultat sont différents.

7 votes

@BarAkiva, la raison pour laquelle c'est faux est que vous perdez la sécurité du type. Si vous renvoyez des valeurs d'un type homogène, vous devriez toujours préférer une liste à un tableau. En particulier, si vous avez affaire à des valeurs génériques, alors une Liste<T> est toujours préférée comme valeur de retour à T[] parce que vous pouvez toujours construire une Liste sur un type générique mais jamais un tableau ; vous ne pouvez pas faire cela : "new T[length] ;" L'approche consistant à créer une classe Pair comme indiqué ici pour les types disparates est une meilleure option pour les types hétérogènes.

51voto

Lars Andren Points 2902

Vous pourriez implémenter un Pair si vous êtes sûr de n'avoir besoin que de retourner deux valeurs :

public class Pair<U, V> {

 /**
     * The first element of this <code>Pair</code>
     */
    private U first;

    /**
     * The second element of this <code>Pair</code>
     */
    private V second;

    /**
     * Constructs a new <code>Pair</code> with the given values.
     * 
     * @param first  the first element
     * @param second the second element
     */
    public Pair(U first, V second) {

        this.first = first;
        this.second = second;
    }

//getter for first and second

et que la méthode renvoie ce Pair :

public Pair<Object, Object> getSomePair();

0 votes

À quoi ressemblerait le retour de cette méthode ?

0 votes

Quelque chose du type : paire = nouvelle paire (chose1, chose2)....renvoie la paire ;

28voto

richj Points 5593

Vous ne pouvez renvoyer qu'une seule valeur en Java, donc la meilleure façon de procéder est la suivante :

return new Pair<Integer>(number1, number2);

Voici une version mise à jour de votre code :

public class Scratch
{
    // Function code
    public static Pair<Integer> something() {
        int number1 = 1;
        int number2 = 2;
        return new Pair<Integer>(number1, number2);
    }

    // Main class code
    public static void main(String[] args) {
        Pair<Integer> pair = something();
        System.out.println(pair.first() + pair.second());
    }
}

class Pair<T> {
    private final T m_first;
    private final T m_second;

    public Pair(T first, T second) {
        m_first = first;
        m_second = second;
    }

    public T first() {
        return m_first;
    }

    public T second() {
        return m_second;
    }
}

3voto

monn Points 387

Essayez ceci :

// Function code
public static int[] something(){
    int number1 = 1;
    int number2 = 2;
    return new int[] {number1, number2};
}

// Main class code
public static void main(String[] args) {
  int[] ret = something();
  System.out.println(ret[0] + ret[1]);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X