偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

代碼如詩(shī)般優(yōu)雅到窒息!這種神級(jí)寫法你敢來(lái)挑戰(zhàn)嗎?

開發(fā) 前端
在 Java 世界里,命名可是一門大學(xué)問(wèn)。好的命名就像詩(shī)的標(biāo)題,能一下子讓你明白代碼的含義。很多小伙伴在寫代碼的時(shí)候,命名那叫一個(gè)隨意,什么 a、b、c,什么 xxObj,完全讓人摸不著頭腦。

兄弟們,咱今天來(lái)嘮嘮一個(gè)既熟悉又神秘的話題 —— 如何讓咱們寫的代碼像詩(shī)一樣優(yōu)雅。咱先別急著談高深的設(shè)計(jì)模式、復(fù)雜的算法,就先從日常寫代碼的那些小事兒說(shuō)起。你有沒有過(guò)這樣的經(jīng)歷:自己寫的代碼,過(guò)了一段時(shí)間再看,居然跟看天書似的,完全不記得當(dāng)時(shí)是怎么想的;或者接手別人的代碼,那代碼亂得跟一團(tuán)麻似的,改一行代碼得提心吊膽,生怕引發(fā)一堆 bug。

這其實(shí)就是代碼不夠優(yōu)雅惹的禍。那什么樣的代碼才算優(yōu)雅呢??jī)?yōu)雅的代碼就像一首優(yōu)美的詩(shī),讀起來(lái)流暢自然,結(jié)構(gòu)清晰,邏輯嚴(yán)謹(jǐn),讓人賞心悅目,而且易于理解和維護(hù)。接下來(lái),咱就一起看看那些能讓代碼如詩(shī)般優(yōu)雅的神級(jí)寫法。

一、命名:讓代碼會(huì) “說(shuō)話”

在 Java 世界里,命名可是一門大學(xué)問(wèn)。好的命名就像詩(shī)的標(biāo)題,能一下子讓你明白代碼的含義。很多小伙伴在寫代碼的時(shí)候,命名那叫一個(gè)隨意,什么 a、b、c,什么 xxObj,完全讓人摸不著頭腦。咱舉個(gè)簡(jiǎn)單的例子,比如要計(jì)算兩個(gè)數(shù)的和,你寫個(gè)方法叫add(),看起來(lái)好像還行,但如果是在一個(gè)復(fù)雜的業(yè)務(wù)場(chǎng)景里,就顯得太籠統(tǒng)了。要是寫成calculateSum(int num1, int num2),是不是一下子就清楚了這個(gè)方法的作用?

再看變量命名,比如表示用戶年齡的變量,你要是命名為ageOfUser,就比a、userAge更清晰直觀。還有類名,應(yīng)該用名詞,而且要準(zhǔn)確表達(dá)類的職責(zé),比如UserService就比UserBiz更合適,因?yàn)镾ervice在 Java 開發(fā)中通常就表示服務(wù)層的類。

在命名的時(shí)候,還要遵循駝峰命名法,類名首字母大寫,變量和方法名首字母小寫。比如類名UserInfo,變量userName,方法getUserInfo()。這樣統(tǒng)一的命名規(guī)范,能讓代碼看起來(lái)整整齊齊,就像詩(shī)的格式一樣規(guī)范。

反例:命名混亂的代碼

public class A {
    private int b;
    private String c;
    public void d(int e, String f) {
        // 業(yè)務(wù)邏輯
    }
}

優(yōu)化后:清晰命名的代碼

public class User {
    private int age;
    private String name;
    public void setUserInfo(int userAge, String userName) {
        age = userAge;
        name = userName;
    }
}

你看,優(yōu)化后的代碼,即使不看具體的邏輯,光看命名就能大概知道這個(gè)類是干什么的,里面的變量和方法是做什么用的。這就好比詩(shī)的每一句都緊扣主題,讓人一目了然。

二、代碼結(jié)構(gòu):層次分明如詩(shī)的段落

一首好詩(shī),段落分明,層次清晰,代碼也一樣。合理的代碼結(jié)構(gòu)能讓我們?cè)陂喿x和維護(hù)代碼時(shí)更加輕松。在 Java 中,我們可以通過(guò)包結(jié)構(gòu)、類的組織、方法的拆分來(lái)構(gòu)建良好的代碼結(jié)構(gòu)。

首先是包結(jié)構(gòu),要根據(jù)功能模塊來(lái)劃分,比如com.example.user可以放用戶相關(guān)的類,com.example.order放訂單相關(guān)的類。這樣當(dāng)我們需要找某個(gè)功能的代碼時(shí),能很快定位到對(duì)應(yīng)的包。

然后是類里面的結(jié)構(gòu),一般來(lái)說(shuō),類里面應(yīng)該先定義成員變量,然后是構(gòu)造方法,接著是普通方法。在方法內(nèi)部,要注意代碼的縮進(jìn)和換行,不要把一大段代碼堆在一起。比如一個(gè)方法里有多個(gè)條件判斷,我們可以把每個(gè)條件塊用換行分隔開,讓邏輯更加清晰。

還有方法的拆分,不要把一個(gè)方法寫得太長(zhǎng),太長(zhǎng)的方法就像一首冗長(zhǎng)的詩(shī),讓人讀起來(lái)費(fèi)勁。如果一個(gè)方法的代碼超過(guò)了一屏,那就應(yīng)該考慮拆分了。比如一個(gè)處理用戶注冊(cè)的方法,里面包含了參數(shù)校驗(yàn)、數(shù)據(jù)入庫(kù)、發(fā)送短信通知等功能,我們可以把參數(shù)校驗(yàn)拆成一個(gè)方法,數(shù)據(jù)入庫(kù)拆成一個(gè)方法,發(fā)送短信通知拆成一個(gè)方法,這樣每個(gè)方法只專注于一件事,代碼結(jié)構(gòu)就會(huì)更加清晰。

反例:結(jié)構(gòu)混亂的代碼

public class UserService {
    private UserDao userDao = new UserDao();
    private SmsService smsService = new SmsService();
    public void register(String userName, String password, String phone) {
        if (userName == null || userName.trim().equals("")) {
            throw new IllegalArgumentException("用戶名不能為空");
        }
        if (password == null || password.trim().equals("")) {
            throw new IllegalArgumentException("密碼不能為空");
        }
        if (phone == null || !phone.matches("^1[3-9]\\d{9}$")) {
            throw new IllegalArgumentException("手機(jī)號(hào)格式不正確");
        }
        User user = new User();
        user.setUserName(userName);
        user.setPassword(password);
        user.setPhone(phone);
        userDao.save(user);
        smsService.sendSms(phone, "注冊(cè)成功");
    }
}

優(yōu)化后:結(jié)構(gòu)清晰的代碼

public class UserService {
    private UserDao userDao = new UserDao();
    private SmsService smsService = new SmsService();
    public void register(String userName, String password, String phone) {
        validateUserInfo(userName, password, phone);
        User user = createUser(userName, password, phone);
        saveUser(user);
        sendRegisterSms(phone);
    }
    private void validateUserInfo(String userName, String password, String phone) {
        if (userName == null || userName.trim().equals("")) {
            throw new IllegalArgumentException("用戶名不能為空");
        }
        if (password == null || password.trim().equals("")) {
            throw new IllegalArgumentException("密碼不能為空");
        }
        if (phone == null || !phone.matches("^1[3-9]\\d{9}$")) {
            throw new IllegalArgumentException("手機(jī)號(hào)格式不正確");
        }
    }
    private User createUser(String userName, String password, String phone) {
        User user = new User();
        user.setUserName(userName);
        user.setPassword(password);
        user.setPhone(phone);
        return user;
    }
    private void saveUser(User user) {
        userDao.save(user);
    }
    private void sendRegisterSms(String phone) {
        smsService.sendSms(phone, "注冊(cè)成功");
    }
}

優(yōu)化后的代碼,把注冊(cè)功能拆分成了參數(shù)校驗(yàn)、創(chuàng)建用戶、保存用戶、發(fā)送短信通知四個(gè)方法,每個(gè)方法的職責(zé)明確,代碼結(jié)構(gòu)層次分明,就像詩(shī)的段落一樣,每一段都有自己的主題,讀起來(lái)輕松多了。

三、設(shè)計(jì)模式:代碼優(yōu)雅的 “詩(shī)眼”

設(shè)計(jì)模式就像一首詩(shī)的 “詩(shī)眼”,畫龍點(diǎn)睛,能讓代碼更加優(yōu)雅、靈活和可擴(kuò)展。在 Java 開發(fā)中,常用的設(shè)計(jì)模式有很多,比如單例模式、工廠模式、策略模式、觀察者模式等等。咱今天就挑幾個(gè)常用的來(lái)聊聊。

(一)單例模式:保證唯一的 “詩(shī)人”

單例模式,就是讓一個(gè)類在整個(gè)應(yīng)用程序中只有一個(gè)實(shí)例。比如我們的日志工具類,整個(gè)應(yīng)用程序只需要一個(gè)日志實(shí)例來(lái)記錄日志,這時(shí)候就可以用單例模式。單例模式有多種實(shí)現(xiàn)方式,比如餓漢式、懶漢式、雙重檢查鎖定式、靜態(tài)內(nèi)部類式等等。其中,靜態(tài)內(nèi)部類式是比較推薦的一種方式,它既保證了線程安全,又能在需要的時(shí)候才創(chuàng)建實(shí)例,兼具了懶漢式和餓漢式的優(yōu)點(diǎn)。

public class Logger {
    private Logger() {
        // 私有構(gòu)造方法,防止外部實(shí)例化
    }
    private static class LoggerHolder {
        private static final Logger INSTANCE = new Logger();
    }
    public static Logger getInstance() {
        return LoggerHolder.INSTANCE;
    }
    public void log(String message) {
        System.out.println("日志:" + message);
    }
}

使用單例模式,我們?cè)谛枰罩竟ぞ叩臅r(shí)候,直接調(diào)用Logger.getInstance()就能拿到唯一的實(shí)例,避免了重復(fù)創(chuàng)建對(duì)象,節(jié)省了資源,而且代碼也更加簡(jiǎn)潔。

(二)工廠模式:批量生產(chǎn) “詩(shī)句” 的工廠

工廠模式,就是把對(duì)象的創(chuàng)建過(guò)程封裝起來(lái),客戶端不需要知道具體的創(chuàng)建細(xì)節(jié),只需要告訴工廠需要什么對(duì)象,工廠就會(huì)生產(chǎn)出來(lái)。比如我們有一個(gè)產(chǎn)品接口Product,有兩個(gè)實(shí)現(xiàn)類ProductA和ProductB,我們可以創(chuàng)建一個(gè)工廠類ProductFactory,來(lái)負(fù)責(zé)創(chuàng)建這兩個(gè)產(chǎn)品對(duì)象。

public interface Product {
    void use();
}
public class ProductA implements Product {
    @Override
    public void use() {
        System.out.println("使用產(chǎn)品A");
    }
}
public class ProductB implements Product {
    @Override
    public void use() {
        System.out.println("使用產(chǎn)品B");
    }
}
public class ProductFactory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ProductA();
        } else if ("B".equals(type)) {
            return new ProductB();
        } else {
            throw new IllegalArgumentException("不支持的產(chǎn)品類型");
        }
    }
}

客戶端使用的時(shí)候,只需要調(diào)用ProductFactory.createProduct("A")就能得到產(chǎn)品 A 的實(shí)例,不需要關(guān)心具體的創(chuàng)建過(guò)程。工廠模式降低了客戶端和具體實(shí)現(xiàn)類之間的耦合度,當(dāng)我們需要新增一種產(chǎn)品時(shí),只需要新增一個(gè)實(shí)現(xiàn)類和修改工廠類的創(chuàng)建邏輯即可,客戶端代碼不需要修改,符合開閉原則。

(三)策略模式:靈活變換的 “詩(shī)風(fēng)”

策略模式,就是定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可以相互替換。比如我們有一個(gè)支付功能,支持支付寶支付、微信支付、銀聯(lián)支付等多種支付方式,每種支付方式的實(shí)現(xiàn)邏輯不同,我們可以使用策略模式來(lái)封裝這些支付策略。

首先定義一個(gè)支付策略接口PaymentStrategy,然后每個(gè)支付方式實(shí)現(xiàn)這個(gè)接口:

public interface PaymentStrategy {
    void pay(double amount);
}
public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用支付寶支付" + amount + "元");
    }
}
public class WechatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用微信支付" + amount + "元");
    }
}
public class UnionPayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用銀聯(lián)支付" + amount + "元");
    }
}

然后創(chuàng)建一個(gè)上下文類PaymentContext,用來(lái)持有具體的支付策略,并提供支付方法:

public class PaymentContext {
    private PaymentStrategy paymentStrategy;
    public PaymentContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
    public void pay(double amount) {
        paymentStrategy.pay(amount);
    }
}

客戶端使用的時(shí)候,只需要?jiǎng)?chuàng)建對(duì)應(yīng)的支付策略實(shí)例,然后傳遞給支付上下文類,就可以使用不同的支付方式了:

public class Client {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext(new AlipayStrategy());
        context.pay(100.0);

        context = new PaymentContext(new WechatPayStrategy());
        context.pay(200.0);

        context = new PaymentContext(new UnionPayStrategy());
        context.pay(300.0);
    }
}

策略模式讓我們的代碼更加靈活,當(dāng)需要新增一種支付方式時(shí),只需要新增一個(gè)策略類即可,不需要修改現(xiàn)有的代碼,符合開閉原則。同時(shí),不同的支付策略可以相互替換,就像不同的詩(shī)風(fēng)一樣,讓代碼更加豐富多彩。

四、異常處理:為代碼 “保駕護(hù)航”

優(yōu)雅的代碼不僅要寫得漂亮,還要經(jīng)得起 “折騰”,也就是要有良好的異常處理機(jī)制。在 Java 中,異常處理是必不可少的一部分,它能讓我們的代碼在遇到錯(cuò)誤時(shí),不會(huì)突然崩潰,而是能夠優(yōu)雅地處理錯(cuò)誤,給用戶友好的提示。

首先,我們要區(qū)分 checked 異常和 unchecked 異常。checked 異常是編譯器會(huì)檢查的異常,比如IOException,我們必須處理它,要么用try-catch捕獲,要么用throws聲明拋出。unchecked 異常是編譯器不會(huì)檢查的異常,比如NullPointerException、ArrayIndexOutOfBoundsException等,通常是由于代碼邏輯錯(cuò)誤導(dǎo)致的。

在處理異常時(shí),我們要遵循幾個(gè)原則:一是不要捕獲了異常卻不處理,只是簡(jiǎn)單地打印一下日志,這樣根本無(wú)法解決問(wèn)題;二是要根據(jù)不同的異常類型,給出不同的處理方式,比如業(yè)務(wù)異??梢苑祷亟o客戶端一個(gè)友好的錯(cuò)誤信息,系統(tǒng)異??梢杂涗浽敿?xì)的日志以便排查問(wèn)題;三是不要使用過(guò)于寬泛的異常類型,比如捕獲Exception,而應(yīng)該捕獲具體的異常類型,這樣才能更精準(zhǔn)地處理異常。

反例:糟糕的異常處理

public void readFile(String fileName) {
    try {
        FileInputStream fis = new FileInputStream(fileName);
        // 讀取文件內(nèi)容
    } catch (Exception e) {
        System.out.println("發(fā)生異常");
    }
}

優(yōu)化后:合理的異常處理

public void readFile(String fileName) {
    if (fileName == null || fileName.trim().equals("")) {
        thrownew IllegalArgumentException("文件名不能為空");
    }
    try (FileInputStream fis = new FileInputStream(fileName)) {
        byte[] buffer = newbyte[1024];
        int length;
        while ((length = fis.read(buffer)) > 0) {
            // 處理讀取到的內(nèi)容
        }
    } catch (FileNotFoundException e) {
        System.out.println("文件不存在:" + fileName);
    } catch (IOException e) {
        System.out.println("讀取文件時(shí)發(fā)生IO異常:" + e.getMessage());
    }
}

優(yōu)化后的代碼,首先對(duì)入?yún)⑦M(jìn)行了校驗(yàn),避免了不必要的異常發(fā)生;然后使用了try-with-resources語(yǔ)句來(lái)自動(dòng)關(guān)閉資源,避免了資源泄漏;最后針對(duì)不同的異常類型進(jìn)行了處理,給出了更詳細(xì)的錯(cuò)誤信息,這樣的異常處理機(jī)制能讓代碼更加健壯,就像為代碼配備了一個(gè)保駕護(hù)航的 “保鏢”。

五、性能優(yōu)化:讓代碼 “跑” 得更快更優(yōu)雅

優(yōu)雅的代碼不僅要好看,還要好用,也就是要有良好的性能。在 Java 開發(fā)中,性能優(yōu)化是一個(gè)永恒的話題,我們可以從算法優(yōu)化、數(shù)據(jù)結(jié)構(gòu)選擇、避免不必要的計(jì)算等方面來(lái)提升代碼性能。

(一)算法優(yōu)化:選擇合適的 “作詩(shī)方法”

算法的好壞直接影響代碼的性能,比如排序算法,冒泡排序的時(shí)間復(fù)雜度是 O (n2),而快速排序的時(shí)間復(fù)雜度是 O (n log n),在數(shù)據(jù)量較大的時(shí)候,快速排序的性能要遠(yuǎn)遠(yuǎn)優(yōu)于冒泡排序。所以在選擇算法的時(shí)候,要根據(jù)具體的場(chǎng)景,選擇合適的算法。

比如我們有一個(gè)需求,要從一個(gè)數(shù)組中查找某個(gè)元素是否存在,如果數(shù)組是無(wú)序的,我們可以使用線性查找,時(shí)間復(fù)雜度是 O (n);如果數(shù)組是有序的,我們可以使用二分查找,時(shí)間復(fù)雜度是 O (log n),性能會(huì)大大提升。

(二)數(shù)據(jù)結(jié)構(gòu)選擇:挑選合適的 “詩(shī)句載體”

不同的數(shù)據(jù)結(jié)構(gòu)有不同的特點(diǎn)和適用場(chǎng)景,比如 List、Set、Map,它們的實(shí)現(xiàn)類有 ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap 等。ArrayList 適合隨機(jī)訪問(wèn)元素,LinkedList 適合在中間插入和刪除元素;HashMap 適合快速查找元素,TreeMap 適合按順序訪問(wèn)元素。

比如我們需要一個(gè)存儲(chǔ)用戶信息的集合,并且需要根據(jù)用戶 ID 快速查找用戶,那么使用 HashMap 就是一個(gè)不錯(cuò)的選擇,它的 get 方法時(shí)間復(fù)雜度是 O (1),能快速找到對(duì)應(yīng)的用戶。

(三)避免不必要的計(jì)算:精簡(jiǎn) “詩(shī)句” 的內(nèi)容

在代碼中,我們要避免進(jìn)行不必要的計(jì)算,比如在循環(huán)中盡量不要執(zhí)行重復(fù)的計(jì)算,能在循環(huán)外計(jì)算的就放在循環(huán)外。比如下面這個(gè)例子:

反例:重復(fù)計(jì)算的代碼

for (int i = 0; i < list.size(); i++) {
    // 業(yè)務(wù)邏輯
}

優(yōu)化后:避免重復(fù)計(jì)算的代碼

int size = list.size();
for (int i = 0; i < size; i++) {
    // 業(yè)務(wù)邏輯
}

優(yōu)化后的代碼,把list.size()的計(jì)算放在了循環(huán)外面,避免了每次循環(huán)都去計(jì)算列表的長(zhǎng)度,提升了性能。

六、注釋:給代碼 “寫詩(shī)的注釋”

注釋就像詩(shī)的注釋一樣,能幫助讀者更好地理解代碼的含義。在 Java 中,注釋分為單行注釋//、多行注釋/* ... */和文檔注釋/** ... */。我們要合理地使用注釋,給關(guān)鍵的類、方法、變量加上注釋,解釋它們的作用、參數(shù)、返回值、異常等信息。

但是,注釋也不能太多太濫,不能把代碼本身已經(jīng)很清晰的邏輯再用注釋重復(fù)一遍,這樣反而會(huì)影響代碼的可讀性。注釋要簡(jiǎn)潔明了,突出重點(diǎn),就像詩(shī)的注釋一樣,畫龍點(diǎn)睛,而不是畫蛇添足。

示例:合理的注釋

/**
 * 用戶服務(wù)類,負(fù)責(zé)處理用戶的注冊(cè)、登錄、信息查詢等業(yè)務(wù)
 */
public class UserService {

    /**
     * 用戶注冊(cè)方法
     * @param userName 用戶名,不能為空
     * @param password 密碼,不能為空
     * @param phone 手機(jī)號(hào),格式必須正確
     * @throws IllegalArgumentException 如果用戶名、密碼為空或手機(jī)號(hào)格式不正確
     */
    public void register(String userName, String password, String phone) {
        // 校驗(yàn)用戶信息
        validateUserInfo(userName, password, phone);
        // 創(chuàng)建用戶對(duì)象
        User user = createUser(userName, password, phone);
        // 保存用戶到數(shù)據(jù)庫(kù)
        saveUser(user);
        // 發(fā)送注冊(cè)成功短信
        sendRegisterSms(phone);
    }
}

這樣的注釋,清晰地說(shuō)明了類和方法的作用、參數(shù)要求、可能拋出的異常等信息,讓讀者能快速理解代碼的功能,就像詩(shī)的注釋幫助讀者理解詩(shī)的意境一樣。

總結(jié):挑戰(zhàn)優(yōu)雅代碼,成就更好的自己

好了,各位小伙伴,咱今天聊了這么多讓代碼優(yōu)雅的神級(jí)寫法,從命名到代碼結(jié)構(gòu),從設(shè)計(jì)模式到異常處理,再到性能優(yōu)化和注釋,每一個(gè)方面都能讓我們的代碼更上一層樓。當(dāng)然,要寫出如詩(shī)般優(yōu)雅的代碼,可不是一朝一夕的事兒,需要我們?cè)谌粘5拈_發(fā)中不斷地實(shí)踐、總結(jié)、反思,養(yǎng)成良好的編碼習(xí)慣。

也許一開始,你會(huì)覺得這些要求有點(diǎn)麻煩,但是當(dāng)你寫出的代碼越來(lái)越優(yōu)雅,越來(lái)越容易維護(hù),越來(lái)越受到同事的認(rèn)可時(shí),你就會(huì)發(fā)現(xiàn),這些付出都是值得的。這就像寫詩(shī)一樣,一開始可能磕磕絆絆,但隨著不斷地練習(xí),你也能寫出優(yōu)美的詩(shī)句。

現(xiàn)在,就請(qǐng)你勇敢地接受這個(gè)挑戰(zhàn),在接下來(lái)的編碼工作中,嘗試運(yùn)用這些神級(jí)寫法,讓你的代碼如詩(shī)般優(yōu)雅到窒息。相信你一定能做到,也相信你的代碼會(huì)因?yàn)槟愕呐Χ兊酶泳省?/p>


責(zé)任編輯:武曉燕 來(lái)源: 石杉的架構(gòu)筆記
相關(guān)推薦

2018-04-25 08:00:54

2025-02-26 00:43:15

LINQC#工具

2022-03-18 07:44:59

插件VSCode代碼

2016-11-03 19:39:11

2019-11-13 13:48:32

前端CSS技術(shù)

2017-12-07 15:05:50

全球互聯(lián)網(wǎng)創(chuàng)新峰會(huì)

2021-05-21 05:24:03

Excel數(shù)據(jù)技巧

2020-03-04 14:05:35

戴爾

2020-08-10 08:38:43

機(jī)房布線顏色

2020-04-26 17:04:18

Python代碼數(shù)據(jù)

2024-01-05 18:01:17

高并發(fā)策略程序

2020-04-03 14:55:39

Python 代碼編程

2022-03-08 06:41:35

css代碼

2015-04-20 11:19:15

2013-07-19 10:27:00

2020-05-08 14:45:00

JS代碼變量

2021-03-03 07:28:58

ReviewAuthor代碼

2019-04-03 08:10:17

代碼架構(gòu)信息

2020-08-20 07:38:51

Java字符串整形

2023-03-23 22:46:38

Spring限流機(jī)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)