Java에서 여러 값이 어떻게 반환됩니까?


11

때로는 함수에서 여러 값을 반환하려고합니다. Java에서 일반적으로 어떻게 수행됩니까?

한 가지 옵션은 목록 또는 튜플을 반환하는이 Python 스 니펫과 같은 배열을 사용하는 것입니다.

value, success = read_unreliably()
if success:
    print value

또 다른 옵션은 다음 JavaScript 예제와 같이 해시 / dict를 반환하는 것입니다.

var result = readUnreliably()
if (result.success) {
    alert(value);
}

이 Java 예제와 같이이 목적을 위해 사용자 정의 객체를 만드는 것이 하나 더 있습니다.

ReadUnreliablyResult result = readUnreliably()
if (result.getSuccess()) {
    System.out.println(result.getValue());
}

물론 일부 전역 변수를 사용하여 물건을 전달하는 대신 필요한 것을 저장할 수도 있지만 옵션이 아니라고 가정 해 봅시다.


"실제"자바 사람들은 공개 게터와 세터를 사용하여 작은 내부 클래스에서 필드를 숨기는 데 어려움을 겪습니까? 그냥 궁금해서
Chris Farmer

3
예, 대부분 그렇습니다. 많은 프레임 워크에서 JavaBean 표준을 기대하므로 getter 및 setter가없는 것을 후회할 수 있습니다. 어쨌든 IDE는 당신을 위해 그것을 생성 할 것입니다.
Eric Wilson

3
또는 YAGNI 원칙에 따라 그대로 둘 수도 있습니다. 그러나 그것은 예상대로 자주 발생하지 않는 것 같습니다.
MatrixFrog

@ FarmBoy : 나는 콩과 같은 것을 이해한다고 생각하지만 OP는 이것이 여러 값을 반환하도록 설계된 일회성 클래스라는 것을 암시합니다.
크리스 파머

@ChrisFarmer 나는 그 맥락에서 '실제'Java 프로그래머 가이 목적을 위해 클래스를 만드는 것을 본 적이 없다고 생각합니다.
Eric Wilson

답변:


26

Java에서 일반적으로 어떻게 수행됩니까?

고통스럽게

하나의 옵션은 목록이나 튜플을 반환하는이 파이썬 스 니펫과 같은 배열을 사용하는 것입니다 ...

또 다른 옵션은이 JavaScript 예제와 같이 해시 / dict를 반환하는 것입니다.

이러한 기술은 Java에서 잘 작동하지 않습니다. 값은 Object에서 다운 캐스트되어야합니다.

이 Java 예제와 같이이 목적을 위해 사용자 정의 객체를 만드는 것이 하나 더 있습니다.

이것은 가장 일반적이지만 작은 클래스를 모두 만드는 것은 지루합니다. C ++에서는 std :: pair를 사용하는 것이 일반적이지만 Java에서는 일반적으로 수행되지 않습니다.

함께 롬복 은 작은 사용자 정의 개체를 생성하는 것은 매우 간단합니다 :

@RequiredArgsConstructor
public class X {
  private final boolean status;
  private final byte[] data;

}


10
"이것은 일반적으로 Java에서 어떻게 이루어 집니까?" "고통스럽게." Java 개발자로서 lol 당신을 위해 +1해야합니다
TheLQ

컴팩트 한 불변의 구조체와 같은 클래스를 사용하는 것은 그리 고통스럽지 않습니다 ... 그것은 실제로 C 구조체를 쓰는 것과 같습니다 ...
Guillaume

1
@Guillaume-물론, 모든 작은 것들이 시간과 공간에 모두 합쳐집니다. 왜 Java 커뮤니티가 "class Pair <T1, T2> {public T1 first; public T2 second; ...}";와 같은 표준 제네릭 세트를 채택하지 않은 이유를 모르겠습니다. 현대 언어에서는 "return a, b"; 그런 다음 "x, y = f ()"를 작성하십시오.
케빈 클라인

1
나는 몇 가지 '고대'언어도 그것을 할 수 있다고 확신한다. 메소드 서명을 변경하십시오.
기 illa

1
"고통스럽게" 비슷한 상황에 처했을 때 Java 개발자로서 느끼는 것과 똑같은 느낌이 들었습니다.
artjom

13

예, Java에서 struct/ tuple/ record를 만드는 방법은 클래스를 만드는 것입니다. 내부 전용 인 경우 공용 필드와 함께 작은 불변 구조체 형 클래스를 사용하는 것을 선호합니다.

예 :

public class Unreliably {
    public final boolean success;
    public final int value;
    public Unreliably(boolean success, int value) {
        this.success = success; this.value = value;
    }
}

스칼라에서 수행하는 것이 훨씬 쉽습니다.

case class Unreliably(success: Boolean, value: Int)

8
실제로 스칼라에서는 일반적으로 a 만 반환합니다 Tuple2[Boolean, Int]. 이 특정 예에서는을 반환합니다 Option[Int].
Jörg W Mittag

2
따라서 이것은 실제 Java 사람들이 내부 클래스가 거의 필요없는 게터와 세터를 만들 필요가 없다는 Chris Farmer의 질문 (Q 의견)에 대답합니다. 당신은 "진정한"자바 사람입니까?
Mike M. Lin

2
다른 소식으로는 진정한 스코틀랜드 인이 없습니다.
조셉 와이즈만

5

예를 들어, 예외를 처리하는 것이 예외를 처리하는 가장 표준적인 방법입니다.

try {
    result = readUnreliably();
    System.out.println(result);
} (catch IOException e) {
    System.out.println("Could not read file");
}

또한, "일을하는 것"기능을 가지려고 노력하는 경우 때때로 편리하지만 여러 값을 반환하는 기능은 덜 필요합니다.


4

A의 인스턴스 하나와 B의 인스턴스 하나를 저장할 수있는 Pair 제네릭 클래스가 있습니다. 같은 방식으로 Triplet 또는 Quadruplet을 만들 수도 있습니다.

public class Pair<A, B>
{
    ...
}

1
그래도 읽을 수없는 코드가 생깁니다. 메소드가를 반환 Pair<String, Integer>하면 그 의미는 무엇입니까? 이 값들은 무엇을 나타 냅니까? 메소드의 구현을 읽지 않으면 알 수 없습니다.
sara mar

1

Java에서 함수는 객체를 반환하거나 실패한 경우 null을 반환합니다. 이런 식으로 여러 데이터 조각을 반환 할 수 있습니다.


1

Java에서 여러 변수를 반환하는 명시적인 방법은 없지만 몇 가지 접근 방식이 있습니다.

  1. 첫 번째는 배열의 길을가는 것입니다. 모든 데이터가 동일한 데이터 형식이거나 일시적으로 한 형식으로 변환 할 수있는 경우에만 작동합니다.
  2. 두 번째 방법은 여러 변수 유형을 전송하기 위해 클래스를 작성하는 것입니다. 제 작업에서이를 DTO 또는 데이터 전송 객체라고합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.