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.
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.
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.
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.
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.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.