簡體   English   中英

Java 從 function 返回時,變量被分配了某個值

[英]Java return from function when variable gets assigned a certain value

如果變量(函數內部)在任何時候被分配了某個值,是否可以留下 function。 例如:

public class TestClass {
    public int doSomething() {
        int resultCode;
        
        resultCode = checkFirstThing() //Returns 0 if succeed or 1 if not
        //Exit if resultCode != 0
        
        resultCode = checkSecondThing() //Returns 0 if succeed or 2 if not
        //Exit if resultCode != 0

        resultCode = checkThirdThing() //Returns 0 if succeed or 3 if not
        //Exit if resultCode != 0

        //do Something if all clauses succeeded

        return resultCode
    }
}

我的問題是,我不想在每個 Check-Function 之后添加if(resultCode != 0) return resultCode
我自己沒有找到任何東西,但是由於那里有一些非常聰明的頭腦,我認為我的其他人知道比我當前的解決方案更好的方法(每次檢查后的保護條款)。

我知道我想要的可能是不可能的,但是這個問題是為了確保。

坦克為您提供幫助:)

您可以為此編寫更高階的 function。 您基本上只是想獲得第一個不為 0 的檢查的結果代碼,或者如果所有檢查都返回 0,則為 0。

public static int checkAll(IntSupplier... resultCodeSuppliers) {
    return Arrays.stream(resultCodeSuppliers)
        .mapToInt(IntSupplier::getAsInt)
        .filter(x -> x != 0)
        .findFirst().orElse(0);
}

這是因為 stream 操作是惰性的。 當我執行findFirst時,它只會運行返回 0 的檢查,以及返回非 0 的第一個檢查。 在那之后它不會再運行任何檢查,因為我只要求它findFirst

用法:

int resultCode = checkAll(
    () -> checkFirstThing(),
    () -> checkSecondThing(),
    () -> checkThirdThing()
);
if (resultCode == 0) { // you only need this one check
    // do the thing...
}
return resultCode;

我突然想到的一種方法是,如果操作成功,您可以讓方法return 1 ,否則throw a exception

然后您可以將所有對方法的調用放在try...catch ,然后如果發生任何異常,您只需從catch語句返回。

祝你好運:)


public class TestClass {
    public int doSomething() {
        int resultCode;
        
        try {
            resultCode = checkFirstThing(); //Returns 1 if succeed
            //Exit if exception thrown

            resultCode = checkSecondThing(); //Returns 1 if succeed
            //Exit if exception thrown

            resultCode = checkThirdThing(); //Returns 1 if succeed
            //Exit if exception thrown
        } catch (/* kind of your exception */) { return 0; /* failure */ }

        //do Something if all clauses succeeded

        return resultCode;
    }
}

您可以使用java.util.OptionalInt的 java.util.OptionalInt 8。

public class TestClass {
    public int doSomething() {
        return OptionalInt.of(checkFirstThing())
            .map(x -> x != 0 ? x : checkSecondThing())
            .map(x -> x != 0 ? x : checkThirdThing())
            .getAsInt();
    }
}

但是,與零的比較是不可避免的,因為您需要 boolean 值而不是 int 值。 也許您可以創建一個包裝器 function 用於與零的比較,並使用OptionalInt.empty()來避免三元運算符。

正確的方法是得到一個結果 object (在它自己的類中實現)。 這個 object 包含一個代碼,如果檢查成功,則由調用的方法(如 checkFirstThing)設置。 object 還包含一個標志或其他信息,檢查是否成功,這也是由您的方法 checkXXThings 設置的。 這樣,您就不會將事務、null 檢查、異常與您的邏輯混在一起,這將不利於可讀性並將技術問題與流程邏輯結合起來。 該代碼並不比您進行 null 檢查的第一個想法短(因為您必須檢查成功標志),但更簡潔和表達您想要檢查的內容。 @Naetmul 的解決方案形式基本相同(只要您為失敗的 checkXXThings 方法調用返回 Optional.empty() )。

您可以更改checkX方法以返回boolean (成功為true ,失敗為false ),並將錯誤代碼移動到調用它們的方法( doSomething() ):

public int doSomething() {
    if (!checkFirstThing()) {
        return 1;
    } else if (!checkSecondThing()) {
        return 2;
    } else if (!checkThirdThing()) {
        return 3;
    } else {
        return 0;
    }
}

可以考慮Spring的框架來解決這種情況。 @看

spring.io

並在方法上使用名為@transactional 的注解。 如果所有子方法無一例外都返回成功,則可以導致方法處理成功。 否則,可能導致方法進程回滾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM