Java開發(fā)者不能忽略的11種return寫法
“return 是不是最常見的關(guān)鍵詞?”
當(dāng)然是。它幾乎無處不在,就像代碼里的分號(hào),久而不察。但你有沒有想過:我們真的用對(duì)了嗎?
今天,我們不講設(shè)計(jì)模式、不談八股文,結(jié)合實(shí)際項(xiàng)目踩坑經(jīng)歷,帶你從 11 個(gè)高頻場(chǎng)景,拆解 return 的優(yōu)雅用法與隱藏陷阱。
寫出讓面試官點(diǎn)頭、同事拍手的代碼,從 return 開始!
return 關(guān)鍵字介紹
return 關(guān)鍵字:
它是方法的終點(diǎn),卻往往決定了邏輯的起點(diǎn)。
它看起來平平無奇,卻能寫出代碼的呼吸感。
表面一個(gè)詞,背后一場(chǎng)選擇:
- 有人把它埋進(jìn)層層嵌套中,邏輯繞得像迷宮;
- 有人卻用它一錘定音,代碼清爽如詩。
其實(shí),return 不只是用來“返回結(jié)果”的,它還是:
- 判斷的終結(jié)者
- 邏輯的分叉口
- 可讀性的調(diào)音師
一個(gè)寫得好的 return,可以讓代碼更清晰、更優(yōu)雅、更少出 bug。
一個(gè)寫得差的 return,則可能讓調(diào)試堪比走迷宮,讓后人抓狂想辭職。
所以——別小看它,return 是寫代碼時(shí)你最該打磨的一把利器!
11 個(gè)實(shí)戰(zhàn)場(chǎng)景
提前返回(衛(wèi)語句)
目標(biāo):讓主流程一眼可見,異常情況“邊緣處理”
? 反面例子:深層嵌套導(dǎo)致閱讀困難
public void processData(Data data) {
if (data != null) {
if (data.isValid()) {
if (checkPermission(data)) {
// 核心邏輯...
} else {
System.out.println("權(quán)限不足");
}
} else {
System.out.println("數(shù)據(jù)無效");
}
} else {
System.out.println("數(shù)據(jù)為null");
}}
推薦寫法:
public void processData(Data data) {
if (data == null) {
System.out.println("數(shù)據(jù)為null");
return;
}
if (!data.isValid()) {
System.out.println("數(shù)據(jù)無效");
return;
}
if (!checkPermission(data)) {
System.out.println("權(quán)限不足");
return;
}
// 核心邏輯直奔主題
System.out.println("處理數(shù)據(jù):" + data.getContent());
System.out.println("處理完成");
}
if 里有 return,就別再寫 else 了
return 自帶“退出方法”的副作用,后續(xù)代碼天然是“else 分支”。
? 不推薦:
public String getStatus(int code) {
if (code == 0) {
return "Success";
} else {
return "Error: " + getErrorMessage(code);
}
}
推薦:
public String getStatus(int code) {
if (code == 0) {
return "Success";
}
return "Error: " + getErrorMessage(code);
}
布爾判斷不寫 if,直接 return 表達(dá)式
? 啰嗦寫法:
public boolean isEligible(User user) {
if (user.getAge() >= 18 && user.isActive())
{
return true;
} else {
return false;
}
}
推薦:
public boolean isEligible(User user) {
return user.getAge() >= 18 && user.isActive();
}
能直接 return 的表達(dá)式,別繞彎子
? 不必要的臨時(shí)變量:
public int calculateSum(int a, int b) {
int sum = a + b;
return sum;
}
推薦:
public int calculateSum(int a, int b) {
return a + b;
}
注意:如果表達(dá)式很復(fù)雜或需復(fù)用,再用臨時(shí)變量提升可讀性
三元運(yùn)算符,讓 return 更緊湊
? 冗長(zhǎng)的 if-else:
public String getLevel(int score) {
String level;
if (score >= 60) {
level = "Pass";
}
else {
level = "Fail";
}
return level;
}
推薦:
public String getLevel(int score) {
return score >= 60 ? "Pass" : "Fail";
}
用于簡(jiǎn)單條件判斷,慎用于嵌套邏輯!
返回空集合,不要返回 null!
? 調(diào)用方必須做 null 判斷:
public List<String> getUsers(String dept) {
List<String> users = findUsersByDepartment(dept);
if (users == null || users.isEmpty()) {
return null;
}
return users;
}
推薦:
public List<String> getUsers(String dept) {
List<String> users = findUsersByDepartment(dept);
return (users == null || users.isEmpty()) ? Collections.emptyList() : users;
}
空集合可遍歷、支持 forEach,調(diào)用方更省心
返回 Optional,優(yōu)雅表達(dá)“可能沒有”
? null 返回帶來不確定性:
public User findUser(String id) {
return found ? user : null;
}
推薦使用 Optional:
public Optional<User> findUser(String id) {
return found ? Optional.of(user) : Optional.empty();
}
調(diào)用方:
findUser("123").ifPresent(u -> System.out.println(u.getName()));
注意:不要返回 null 的 Optional,否則是災(zāi)難!
循環(huán)中一旦滿足條件就 return
? 不推薦:
public Product findProduct(List<Product> list, String name) {
Product result = null;
for (Product p : list) {
if (p.getName().equals(name)) {
result = p;
break;
}
}
return result;
}
推薦:
public Product findProduct(List<Product> list, String name) {
for (Product p : list) {
if (p.getName().equals(name)) {
return p;
}
}
return null;
}
Java 14+ 用 switch 表達(dá)式更清晰
推薦寫法:
public String getDayType(DayOfWeek day) {
return switch (day) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Workday";
case SATURDAY, SUNDAY -> "Weekend";
};
}
語法簡(jiǎn)潔、編譯期校驗(yàn)完整性、更安全!
返回更有語義的枚舉,而非魔法值
? 模糊寫法:
public int processOrder(Order order) {
if (order == null) return -1;
if (!checkInventory(order)) return 1;
return 0;
}
推薦:
enum OrderStatus {
SUCCESS, NULL_ORDER, NO_INVENTORY
}
public OrderStatus processOrder(Order order) {
if (order == null) return OrderStatus.NULL_ORDER;
if (!checkInventory(order))
return OrderStatus.NO_INVENTORY;
return OrderStatus.SUCCESS;
}
自解釋,業(yè)務(wù)含義清晰
不要在 finally 塊中 return!
? 反例:
public int trickyReturn() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
// 會(huì)覆蓋上面的所有返回/異常!
}
}
推薦:讓 finally 專注于清理資源
public int safeReturn() {
try {
return 1;
} catch (Exception e) {
return -1;
}
finally {
cleanup();
// 只做清理!
}
}
總結(jié)
return 小技巧,藏著大智慧
return 雖小,卻是一段邏輯的出口,代碼清晰與否,它說了算。
掌握它的使用哲學(xué):
- 提前結(jié)束無效路徑
- 表達(dá)意圖而非過程
- 減少嵌套,增加可讀性
- 讓未來的你和團(tuán)隊(duì)同事都能輕松看懂
愿你從今天起,少寫一點(diǎn) if 嵌套,多一點(diǎn) return 的智慧。
從碼農(nóng),到架構(gòu)師,return 是起點(diǎn),不是終點(diǎn)。
到此這篇關(guān)于Java開發(fā)者不能忽略的11種return寫法的文章就介紹到這了,更多相關(guān)Java return寫法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Spring中的@Configuration中的proxyBeanMethods屬性
這篇文章主要介紹了關(guān)于Spring中的@Configuration中的proxyBeanMethods屬性,需要的朋友可以參考下2023-07-07
Java通過PowerMockito和Mokito進(jìn)行單元測(cè)試的實(shí)現(xiàn)
PowerMockito和Mockito都是Java語言中的測(cè)試框架,用于進(jìn)行單元測(cè)試和集成測(cè)試,本文就來詳細(xì)的介紹一下通過PowerMockito和Mokito進(jìn)行單元測(cè)試,感興趣的可以了解一下2023-08-08
SpringBoot文件上傳(本地存儲(chǔ))回顯前端操作方法
這篇文章主要介紹了SpringBoot文件上傳(本地存儲(chǔ))回顯前端操作方法的相關(guān)資料,文中講解了文件上傳的基本原理,包括前端調(diào)用后端接口上傳文件,后端返回文件路徑給前端,前端通過路徑訪問圖片,需要的朋友可以參考下2024-11-11
HttpServletResponse亂碼問題_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了HttpServletResponse亂碼問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
詳解Java中ExceptionInInitializer錯(cuò)誤的解決方法
ExceptionInInitializerError 是 Java 中的未經(jīng)檢查的異常,它是 Error 類的子類, 它屬于運(yùn)行時(shí)異常的類別,下面我們就來看看它的具體解決方法吧2024-02-02
SpringBoot+jsp項(xiàng)目啟動(dòng)出現(xiàn)404的解決方法
這篇文章主要介紹了SpringBoot+jsp項(xiàng)目啟動(dòng)出現(xiàn)404的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
一次"java:程序包org.aspectj.lang不存在"問題解決實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次"java:程序包org.aspectj.lang不存在"問題解決的實(shí)戰(zhàn)過程,這個(gè)錯(cuò)誤提示意味著你的Java程序中引用了org.aspectj.lang這個(gè)包,但是該包并不存在,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06

