2012-07-04 3 views
3

java에서 데이터베이스의 사용자를 조회하고 해당 주소와 팀을 반환하는 메소드가 있다고 가정 해 봅니다.Java 메서드에서 두 값 반환

메서드에서 두 값을 모두 반환하고 데이터베이스 호출이 포함되어 있고 두 번 호출 수와 관련된 메서드를 두 개로 나누고 싶지 않습니다.

중간 규모 이상의 소프트웨어 프로젝트에서 일반적으로 발생하는 문제를 고려할 때 최상의 선택은 무엇입니까?

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

나는 문제는 기존의 것들과 중복의 냄새 알고 있지만, 서로 질문은 내가 다시 물어 가치라고 생각이 예에서 충분히 다른 만든 몇 가지 요소를 가지고 있었다.

+0

몇 가지 제안 ... 직접 구조체 만들기/키 - 값 쌍/매개 변수의 포인터 전달 같은 사용 –

+0

Alvin - java의 포인터? – BeeOnRope

답변

9

당신은 몇 가지 옵션이 다중 값 맵에 대한 자세한 내용을 알 수 있습니다.

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

또는 경우 : 가장 OOP는, 그

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

아니면 간단한 솔루션을 원하는 경우 객체의 배열을 반환 할 수 있습니다 뭔가를 그 두 속성을 캡슐화하는 클래스를 생성 할 것이다 당신은, 당신이 그 속성을 소비하는 몇 가지 인터페이스를 가질 수있는이 같은 일부 라이브러리에이 방법을 보여주고 싶지 :

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; } 
    }; 
    } 
} 
+0

나는이 목적을 위해 수업을 만들고 싶지 않습니다. 여분의 소음. 또한 사용자의 팀과 이름은 "논리적으로 바인딩되지"않습니다. 쿼리에서 반환 할 수있는 모든 값 조합을 나타내는 다른 클래스를 만들어야합니까? – BeeOnRope

+2

발신자가 예상 할 내용을 알고있는 경우 사용자의 키가 Address 및 Team 인 Map 에 배치 할 수 있습니다. 이것은 호출자가 어떤 키를 찾을지를 잘 알고 있습니다. – Thomas

+0

그래서 두 가지 옵션, 즉 내가 제시 한 두 번째 솔루션 (배열 하나)을 사용하거나 @Hhomas가 제안한대로 HashMap을 반환하는 약간의 애호가를 얻으십시오. –

0

지도 도움말, 다중 값 맵. 여기서 키는 사용자 이름이고 2 값은 주소 및 팀 이름입니다. 나는 가정하고 모두 당신의 주소와 팀이 문자열 변수입니다, 당신은 여기

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

+0

사용자 이름은 무엇이고 주소는 무엇인지 어떻게 알 수 있습니까? – BeeOnRope

+0

@BeeOnRope : 정상적인지도로 할 수 있습니다. String을 Object에 매핑 할 수 있습니다. 이것은'Object []'보다 덜 치명적이지만 여전히 클래스를 만드는 것만 큼 좋지 않습니다. – nhahtdh

+0

첫 번째 값은 항상 키입니다 .. 이것은 사용자 이름이고 teh 값은 주소와 팀 이름입니다. 귀하의지도는 , Address1, Team1>과 같이 보일 것입니다. 그러면 값을 반복하여 쉽게 반복 할 수 있고 주소와 팀 이름을 얻을 수 있습니다. –

0

먼저 모델을 당신의 추상화, 관계 및 다중성 (예 : 이하). 그런 다음 그에 따라 표를 모델링 할 수 있습니다. 이 두 단계를 수행하면 객체 그래프를로드하도록 구성 할 수있는 JPA을 활용하거나 적절한 SQL JOIN을 사용하여 SQL 쿼리를 실행하여 JDBC 코드를 작성하고 자체 그래프를 만들 수 있습니다.

  • 는 사용자가 (더 팀에 대한 사용자의 플레이를 할 수 있습니다?) 팀이 1 명 이상의 사용자를 가질 수
  • 은 주소를 가지고
0

당신은 사용자 이름과 그룹 문자열 배열을 반환 할 수 있습니다 그 안에 이름. 이 방법은 다음과 같이 보입니다.

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

    return result; 
} 
0

이런 종류의 문제에 대한 일반적인 해결책은 반환하려는 값만큼 속성을 가진 사용자 정의 객체를 만드는 것입니다. 이 클래스를 새로 만들 수없는 경우 Map<String, Object>을 사용할 수 있지만이 방법은 형식에 안전하지 않습니다.

0

나는 이 일반 Pair 클래스를 이미 가지고 있다고 생각했지만 찾을 수 없습니다. Java 1.5 이상을 사용하는 경우 generics를 사용하여 직접 빌드 할 수 있습니다.

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; 
    } 
} 

필드가 비공개와 게터를 추가하시기 바랍니다. :)이 쉽게 사용 :

Apache Commons LangPair

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

업데이트. 더 많은 옵션은 this SO question을 참조하십시오.