Java: devolver varios valores en función

En este post de programación en Java y trabajo con funciones o métodos te mostraré cómo regresar 2 valores en una función.

Además de enseñarte un ejemplo para regresar dos valores te enseñaré cómo devolver varios valores, es decir, 3, 4, 5, etcétera.

Vamos a ver varios enfoques y ejemplos. Por cierto, ya te mostré cómo hacerlo en C# y PHP.

Método simple: con arreglos

Comencemos viendo cómo regresar varios datos en Java usando arreglos. Un arreglo puede ser de cualquier longitud fija, por lo tanto podemos definir un método así:

public static String[] obtenerDosCadenas() {
    String nombre = "Luis";
    String apellido = "Cabrera";
    return new String[]{nombre, apellido};
}

En este caso estoy devolviendo dos cadenas, pero puede ser cualquier tipo de dato del arreglo. Y de este modo estaríamos devolviendo dos valores, aunque pueden ser más.

Para usarlo hacemos lo siguiente:

String[] arreglo = obtenerDosCadenas();
String nombre = arreglo[0];
String apellido = arreglo[1];

Si bien esta práctica no es recomendada porque tenemos que ir a ver el código de la función para saber los índices de los datos, es la más simple.

Devolver dos valores usando SimpleEntry

Existe una clase llamada SimpleEntry que guarda una clave y un valor genéricos. Así que ambos pueden ser de cualquier tipo. Aquí un ejemplo que devuelve una cadena y un entero:

public static AbstractMap.SimpleEntry<String, Integer> obtenerSimpleEntry() {
    String nombre = "Luis";
    int edad = 23;
    return new AbstractMap.SimpleEntry<>(nombre, edad);
}

Fíjate en que estoy indicando el tipo de dato de la clave y valor al definir el método. Y ahora para llamarlo debo definir una instancia de esta clase indicando los mismos tipos de datos en ese orden:

AbstractMap.SimpleEntry<String, Integer> simpleEntry = obtenerSimpleEntry();
String nombre = simpleEntry.getKey();
int edad = simpleEntry.getValue();

La ventaja de este método es que podemos revisar los tipos de datos en tiempo de compilación, previniendo varios errores.

Devolver múltiples valores con clase

Ahora veamos el método recomendado para devolver varios valores en una función de Java. Lo mejor es crear una clase auxiliar que represente lo que vamos a representar.

No importa lo tedioso que parezca, al final es mejor. Por ejemplo, tenemos un método que devuelve el nombre y edad. Podemos crear una clase llamada NombreConEdad:

class NombreConEdad {
    String nombre;
    int edad;

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public NombreConEdad(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
}

Y luego indicar que vamos a devolver una instancia de esa clase en nuestro método:

public static NombreConEdad obtenerDatos() {
    String nombre = "Luis";
    int edad = 23;
    return new NombreConEdad(nombre, edad);
}

Ahora podemos usar los getters y setters; pero lo más importante es que sabemos lo que la función nos devuelve. Ya no nos devuelve algo genérico, sabemos lo que regresa: un nombre con edad.

De este modo sabemos (como humanos) lo que la función regresa.

Devolver múltiples datos – Ejemplo final

Para terminar el post te mostraré cómo devolver 3 o infinitos valores en una función de Java. Lo haremos de nuevo con clases, mejorando el método anterior.

Arriba te mostré que puedes usar una clase, pero recuerda que debes encontrar el parecido a una cosa real de la vida real. Por lo tanto si quisiéramos devolver 3 valores: el nombre, apellido y edad probablemente sería mejor crear la clase Persona en lugar de la clase NombreConApellidoYEdad.

class Persona {
    String nombre;
    String apellido;
    int edad;

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public Persona(String nombre, String apellido, int edad) {
        this.nombre = nombre;
        this.apellido = apellido;
        this.edad = edad;
    }
}

Lo que quiero darte a entender aquí es que debes buscar la clase significativa que represente lo que vas a devolver, abstrayendo con cosas de la vida real. De este modo vas a tener un código más limpio y entendible.

public static Persona obtenerMasValores() {
    String nombre = "Luis";
    String apellido = "Cabrera";
    int edad = 23;
    return new Persona(nombre, apellido, edad);
}

Finalmente te dejo el código completo de los ejemplos mostrados aquí:


/*
https://parzibyte.me/blog
* */

import java.util.AbstractMap;

class NombreConEdad {
    String nombre;
    int edad;

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public NombreConEdad(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
}

class Persona {
    String nombre;
    String apellido;
    int edad;

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public Persona(String nombre, String apellido, int edad) {
        this.nombre = nombre;
        this.apellido = apellido;
        this.edad = edad;
    }
}

public class Main {

    public static NombreConEdad obtenerDatos() {
        String nombre = "Luis";
        int edad = 23;
        return new NombreConEdad(nombre, edad);
    }

    public static Persona obtenerMasValores() {
        String nombre = "Luis";
        String apellido = "Cabrera";
        int edad = 23;
        return new Persona(nombre, apellido, edad);
    }

    public static String[] obtenerDosCadenas() {
        String nombre = "Luis";
        String apellido = "Cabrera";
        return new String[]{nombre, apellido};
    }

    public static AbstractMap.SimpleEntry<String, Integer> obtenerSimpleEntry() {
        String nombre = "Luis";
        int edad = 23;
        return new AbstractMap.SimpleEntry<>(nombre, edad);
    }

    public static void main(String[] args) {
        String[] arreglo = obtenerDosCadenas();
        String nombre = arreglo[0];
        String apellido = arreglo[1];

        AbstractMap.SimpleEntry<String, Integer> simpleEntry = obtenerSimpleEntry();
        nombre = simpleEntry.getKey();
        int edad = simpleEntry.getValue();

        NombreConEdad nombreConEdad = obtenerDatos();
        nombre = nombreConEdad.getNombre();
        edad = nombreConEdad.getEdad();

        Persona p = obtenerMasValores();
        nombre = p.getNombre();
        apellido = p.getApellido();
        edad = p.getEdad();

    }
}

Te dejo con un enlace para aprender más sobre Java en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *