![](/img/trans.png)
[英]Java return from function when variable gets assigned a certain value FOLLOW UP
[英]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的框架來解決這種情況。 @看
並在方法上使用名為@transactional 的注解。 如果所有子方法無一例外都返回成功,則可以導致方法處理成功。 否則,可能導致方法進程回滾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.