Devolver dos valores de un método java

Digamos que tengo un método en Java, que busca un usuario en una base de datos y devuelve su dirección y el equipo en el que está.

Quiero devolver ambos valores del método y no quiero dividir el método en dos porque implica una llamada a la base de datos y la división implica el doble de llamadas.

Dadas las preocupaciones típicas en un proyecto de software de moderado a grande, ¿cuál es la mejor opción?

whatGoesHere getUserInfo(String name) {
  // query the DB
}

Sé que la pregunta huele a duplicación con las existentes, pero cada pregunta tenía algún elemento que la hacía lo suficientemente diferente de este ejemplo que pensé que valía la pena volver a preguntar.

preguntado el 04 de julio de 12 a las 04:07

algunas sugerencias ... cree una estructura usted mismo / use algo como un par clave-valor / pase el puntero en el parámetro -

6 Respuestas

tienes algunas opciones Lo más OOP será crear una clase para encapsular esas 2 propiedades, algo así

private class UserInfo {
  private Address address;
  private Team team;
}

O si desea una solución simple, puede devolver una matriz de objetos:

Object[] getUserInfo(String name) {
  // query the DB
  return new Object[]{address,team};
}

O si desea exponer este método a alguna biblioteca, puede tener alguna interfaz que consumirá esas propiedades, algo como esto:

class APIClass{
  interface UserInfo{
    public Address getAddress();
    public Team getTeam();
  }

  UserInfo getUserInfo(String name) {
    // query the DB
    return new UserInfo(){
         public Address getAddress(){ return address; }
         public Team getTeam(){ return team; }
    };
  }
}

Respondido 06 Jul 12, 18:07

No quiero crear una clase solo para este propósito, ya que genera ruido adicional. Además, el equipo y el nombre del usuario no están "vinculados lógicamente". ¿Debería crear una clase diferente para representar cada combinación de valores que podría querer devolver de una consulta? - abejaencuerda

Si la persona que llama sabe qué esperar, puede ponerlo en un Mapa donde sus claves serían Dirección y Equipo. Sin embargo, esto depende en gran medida de que la persona que llama sepa qué teclas buscar. - Thomas

entonces, tiene 2 opciones, la segunda solución que le mostré (la matriz), o se vuelve un poco más elegante al devolver un HashMap, como sugirió @Thomas. - Arturo Neves

Creo que el getUserInfo del enfoque API debería devolver UserInfo no Object[]. - RP-

Yo también. No devuelva una matriz. es una solución desordenada. Utilice la clase "UserInfo". incluso puede agregar valores más tarde sin cambiar todo. Y como ya dijo Thomas... la persona que llama sabe qué esperar. entonces una clase UserInfo está bien. - algún_codificador

No puedo ayudar con un mapa, un mapa multivalor. Donde la clave es el nombre de usuario y los 2 valores son la dirección y el nombre del equipo. Supongo que tanto su dirección como su equipo son variables de cadena. Puede obtener más información sobre el mapa multivalor aquí.

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html

http://apachecommonstipsandtricks.blogspot.in/2009/01/multi-value-map-values-are-list.html

Respondido 04 Jul 12, 04:07

¿Cómo sabría cuál es el nombre de usuario y cuál es la dirección? - abejaencuerda

@BeeOnRope: puedes hacerlo solo con el mapa normal. Puede asignar una cadena a un objeto. Esto es menos escamoso que Object[], pero aún no es tan bueno como crear una clase. - nhahtdh

El primer valor es siempre la clave... que es su nombre de usuario y los valores son la dirección y los nombres de los equipos. su mapa se verá como ,Dirección1,Equipo1> Luego puede hacer fácilmente una iteración sobre los valores y obtener la dirección y los nombres de los equipos: Raveesh Sharma

Primero modele bien sus abstracciones, relaciones y multiplicidad (vea un ejemplo a continuación). Luego puede modelar tablas en consecuencia. Una vez realizados estos dos pasos, puede aprovechar JPA que se puede configurar para cargar su gráfico de objetos o puede escribir código JDBC y crear el gráfico usted mismo ejecutando una consulta SQL con SQL JOIN adecuados.

  • Un usuario tiene una dirección
  • Un equipo puede tener 1 o más usuarios (¿y un usuario puede jugar para más equipos?)

Respondido 04 Jul 12, 04:07

Puede devolver una matriz de cadenas con el nombre de usuario y el nombre del grupo. El método se parece a:

public String[] getUserInfo(String name) {
    String[] result = new String[2];
    // query the DB
    ...
    result[0] = userName;
    result[1] = groupName;

    return result;
}

Respondido 04 Jul 12, 04:07

Una solución común para este tipo de problema es crear un objeto personalizado con tantos atributos como los valores que desea devolver. Si no puede crear una nueva clase para esto, puede usar un Map<String, Object>, pero este enfoque no es seguro para tipos.

Respondido 04 Jul 12, 15:07

pensé Guayaba tenía un genérico Pair clase ya, pero no puedo encontrarlo. Puede crear el suyo propio usando genéricos si está en Java 1.5+.

public class Pair<X,Y>
{
    public final X first;
    public final Y second;

    public Pair(X first, Y second) {
        this.first = first;
        this.second = second;
    }
}

Siéntase libre de hacer que los campos sean privados y agregar captadores. :) Usarlo es fácil:

return new Pair<Address,Team>(address, team);

Actualizar

Idioma Apache Commons tiene Pair. Vea esta pregunta SO para mas opciones

contestado el 23 de mayo de 17 a las 13:05

En java 8, hemos incorporado Pair clase en el paquete javafx.util. - Aashish Pawar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.