Come vengono restituiti più valori in Java?

11

A volte si desidera restituire più valori da una funzione. In che modo questo normalmente è fatto in Java?

Un'opzione è usare un array, come questo frammento di Python che restituisce una lista o una tupla:

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

Un'altra opzione sarebbe quella di restituire un hash / dict, come questo esempio JavaScript:

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

Un altro sarebbe quello di creare un oggetto personalizzato solo per questo scopo, come questo esempio di Java:

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

Ovviamente puoi anche utilizzare alcune variabili globali per archiviare ciò che ti serve invece di passare le cose, ma diciamo che non è un'opzione.

    
posta Mike M. Lin 26.07.2011 - 01:39
fonte

6 risposte

26

How is this normally done in Java?

Dolorosamente.

One option is to use an array, like this Python snippet that returns a list or tuple...

Another option would be to return a hash/dict, like this JavaScript example...

Queste tecniche non funzionano bene in Java; i valori dovrebbero essere scartati da Object.

One more would be to create a custom object just for this purpose, like this Java example...

Questo è più comune, ma è noioso creare tutte quelle piccole classi. In C ++ è comune usare std :: pair ma questo non è comunemente fatto in Java.

Con Lombok è abbastanza facile creare piccoli oggetti personalizzati:

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

}

    
risposta data 26.07.2011 - 02:00
fonte
13

Sì, il modo per creare un struct / tuple / record in Java è creare una classe. Se è solo per uso interno, preferisco usare una piccola classe struct immutabile con campi pubblici.

Esempi:

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

Questo è molto più facile da fare in Scala:

case class Unreliably(success: Boolean, value: Int)
    
risposta data 26.07.2011 - 02:18
fonte
5

Per l'esempio che hai fornito, lanciare un'eccezione sarebbe il modo più normale per gestirlo:

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

Inoltre, se ti sforzi di avere funzioni che "fanno una cosa", la funzione di restituire più valori è meno necessaria, anche se a volte comoda.

    
risposta data 26.07.2011 - 04:39
fonte
4

Abbiamo una classe generica Pair che può memorizzare un'istanza di A e un'istanza di B. Probabilmente puoi creare una Triplet o una Quadruplet nello stesso modo.

public class Pair<A, B>
{
    ...
}
    
risposta data 26.07.2011 - 10:55
fonte
1

In Java, la tua funzione restituirebbe un oggetto (o forse null nel caso di un errore). In questo modo, è possibile restituire più parti di dati.

    
risposta data 26.07.2011 - 02:18
fonte
1

Non esiste un modo esplicito per restituire più variabili in Java, tuttavia ci sono alcuni approcci:

  1. Il primo è quello di seguire la strada dell'array. Questo funziona davvero solo se hai tutto come lo stesso tipo di dati o puoi convertire temporaneamente li a un tipo.
  2. Il secondo modo è creare una classe allo scopo di trasferire più tipi di variabili. Nel mio lavoro ci riferiamo a questi come DTO o Data Transfer Objects.
risposta data 26.07.2011 - 02:28
fonte

Leggi altre domande sui tag