web-dev-qa-db-ja.com

複数のデータタイプの値を返すJava関数を記述する方法は?

たとえば、任意の数値(負、ゼロ、または正)を返すことができる関数を作成したいとします。

ただし、特定の例外に基づいて、関数がBooleanFALSEを返すようにしたい

intor a Booleanを返すことができる関数を書く方法はありますか?


わかりましたので、これは多くの応答を受けました。私は単に問題に間違って取り組んでいることを理解しており、メソッドで何らかの例外をthrowする必要があります。より良い答えを得るために、私はいくつかのサンプルコードを提供します。面白がらないでください:)

public class Quad {

  public static void main (String[] args) {

    double a, b, c;

    a=1; b=-7; c=12;
    System.out.println("x = " + quadratic(a, b, c, 1));   // x = 4.0
    System.out.println("x = " + quadratic(a, b, c, -1));  // x = 3.0


    // "invalid" coefficients. Let's throw an exception here. How do we handle the exception?
    a=4; b=4; c=16;
    System.out.println("x = " + quadratic(a, b, c, 1));   // x = NaN
    System.out.println("x = " + quadratic(a, b, c, -1));  // x = NaN

  }

  public static double quadratic(double a, double b, double c, int polarity) {

    double x = b*b - 4*a*c;

    // When x < 0, Math.sqrt(x) retruns NaN
    if (x < 0) {
      /*
        throw exception!
        I understand this code can be adjusted to accommodate 
        imaginary numbers, but for the sake of this example,
        let's just have this function throw an exception and
        say the coefficients are invalid
      */
    }

    return (-b + Math.sqrt(x) * polarity) / (2*a);

  }

}
17
maček

いいえ、Javaではできません。

ただし、Objectを返すことができます。また、オブジェクトを返すことで、技術的にはJava.lang.IntegerJava.lang.Booleanなどの派生クラスを返すことができます。しかし、私はそれが最良の考えだとは思いません。

13

あなたは技術的にこれを行うことができます:

public <T> T doWork()
{
   if(codition)
   {
      return (T) new Integer(1);
   }
   else
   {
      return (T) Boolean.FALSE;
   }
}

次に、このコードはコンパイルされます。

int x = doWork(); // the condition evaluates to true
boolean test = doWork();

ただし、メソッドが誤ったタイプを返す場合は、ランタイム例外が発生する可能性が最も高くなります。 TはJava.lang.Objectに消去されるため、プリミティブの代わりにオブジェクトを返す必要もあります。つまり、返される型はオブジェクトを拡張する必要があります(つまり、オブジェクトである必要があります)。上記の例では、オートボクシングを使用してプリミティブな戻り値の型を実現しています。

IMOでは例外処理の使用を評価する必要があるため、このアプローチはお勧めしません。例外を使用して何かを実行できる場合(つまり、リカバリー、永続化、再試行など)、例外的なケースで例外をキャッチします。例外は、予想されるワークフローのexceptionであり、ワークフローの一部ではありません。

12
hisdrewness

番号。あなたができる最善のことは、あなたが返したいかもしれないすべてのものを処理するクラスのインスタンスに戻ることです。

何かのようなもの

public class ReturnObj {
   public bool yesno; // yes or no
   public int val; // for int values
   public String mode; // mode describing what you returned, which the caller will need to understand.
}

明らかに、あなたは名前で遊ぶ必要があります...

また、これはコードのにおいのようです。関数の外で必要なパスを修飾することで、このようなことを行う必要をなくし、修飾に応じて特定の関数を呼び出してブール値を取得したり、特定の関数を呼び出してintを取得したりできます。

6
hvgotcodes

IEEE浮動小数点

IEEE浮動小数点にはNaNの表現が含まれているため、ほとんどの言語は、例外や共用体型なしで特定の例を処理します。 Javaでは、Double.NaNを使用します。

public static double quadratic(double a, double b, double c, int polarity) {
    double x = b*b - 4*a*c;

    // When x < 0, Math.sqrt(x) retruns NaN
    if (x < 0) {
        return Double.NaN;
    }
    return (-b + Math.sqrt(x) * polarity) / (2*a);
}

それはあなたが望む正確な出力を生成します:

x = 4.0
x = 3.0
x = NaN
x = NaN

例外

例外は古いものですJava同様の問題を解決する方法:

public static double quadratic(double a, double b, double c, int polarity) {
    double x = b*b - 4*a*c;
    // When x < 0, Math.sqrt(x) returns NaN
    if (x < 0) {
        throw new Exception("NaN")
    }
    return (-b + Math.sqrt(x) * polarity) / (2*a);
}

例外のクライアントコードは次のとおりです。

a=1; b=-7; c=12;

// x = 4.0
try {
    System.out.println("x = " + quadratic(a, b, c, 1));
} catch (Exception iae) {
    System.out.println("Oopsie: " + iae.getMessage());
}

// x = 3.0
try {
    System.out.println("x = " + quadratic(a, b, c, -1));
} catch (Exception iae) {
    System.out.println("Oopsie: " + iae.getMessage());
}

// "invalid" coefficients.
a=4; b=4; c=16;

// Oopsie: NaN
try {
    System.out.println("x = " + quadratic(a, b, c, 1));
} catch (Exception iae) {
    System.out.println("Oopsie: " + iae.getMessage());
}

// Oopsie: NaN
try {
    System.out.println("x = " + quadratic(a, b, c, -1));
} catch (Exception iae) {
    System.out.println("Oopsie: " + iae.getMessage());
}

ユニオンタイプ

メソッドとの間で関係のない型を本当に渡したり返したりするには、Javaは実際にはサポートしていないUnion型が必要です。しかし、Paguroは nion Types を提供し、 Javaこのように(Orを使用):

public static Or<Double,String> quadratic(double a, double b,
                                          double c, int polarity) {
    double x = b*b - 4*a*c;

    // When x < 0, Math.sqrt(x) retruns NaN
    if (x < 0) {
        return Or.bad("NaN");
    }
    return Or.good((-b + Math.sqrt(x) * polarity) / (2*a));
}

@Test public void testQuadradic() {
    double a, b, c;
    a=1; b=-7; c=12;

    // x = Good(4.0)
    System.out.println("x = " + quadratic(a, b, c, 1));

    // x = 3.0
    System.out.println(
            (String) quadratic(a, b, c, -1)
                    .match(good -> "x = " + good,
                           bad -> "Oopsie: " + bad));

    // "invalid" coefficients.
    a=4; b=4; c=16;

    // x = Bad("NaN")
    System.out.println("x = " + quadratic(a, b, c, 1));

    // Oopsie: NaN
    System.out.println(
            (String) quadratic(a, b, c, -1)
                    .match(good -> "x = " + good,
                           bad -> "Oopsie: " + bad));
}

結論

特定の例では、浮動小数点を使用します。より一般的な解決策として、例外よりもユニオンタイプの方が便利だと思います。共用体タイプを、共通のインターフェースまたは祖先を持たない2つの異なる入力を受け取る可能性があるメソッドの引数として使用できます。また、関数型プログラミングにより友好的です。

4
GlenPeterson

Objectを返す関数を記述します。 BooleanまたはIntegerラッパーオブジェクトを返すようにしてください。次に、instanceofを使用して、どちらを使用するかを判断します。

3
Alex Churchill

いいえ、1つは顧客への返品参照です。

Booleanとintを一緒にカプセル化する応答オブジェクトを作成し、気まぐれに従って値を設定できます。

しかし、私がユーザーだったら、あなたのデザインは混乱していたと思います。

1
duffymo

私の先生は、Java

import Java.util.Scanner;

public class Program {
    static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        System.out.println("Enter number");
        String input = scanner.next();
        int[] num ={0};
        if(tryParse(input,num))
            System.out.println(num[0] * num[0]);
    }
    static boolean tryParse(String inputString,int[] outputInt){
        try{
            outputInt[0] = Integer.parseInt(inputString);
            return true;
        }catch(Exception e){
            return false;
        }
    }
}
1
Munchyzzz

これは、何をしたいかによっては最善の解決策ではないかもしれませんが、問題を解決する簡単な方法は、関数が可能範囲外の整数または定数(RETURNED_FALSE/TRUEなど)を返し、それを確認することです。 。

0
EscapeNT