{"id":577,"date":"2026-09-21T18:27:27","date_gmt":"2026-09-21T10:27:27","guid":{"rendered":"https:\/\/www.kirasu.cn\/index.php\/2026\/09\/21\/%e8%af%be%e7%a8%8b-02-java21%e6%96%b0%e7%89%b9%e6%80%a7%e9%80%9f%e8%a7%88-2\/"},"modified":"2026-09-21T18:27:27","modified_gmt":"2026-09-21T10:27:27","slug":"%e8%af%be%e7%a8%8b-02-java21%e6%96%b0%e7%89%b9%e6%80%a7%e9%80%9f%e8%a7%88-2","status":"publish","type":"post","link":"https:\/\/www.kirasu.cn\/index.php\/2026\/09\/21\/%e8%af%be%e7%a8%8b-02-java21%e6%96%b0%e7%89%b9%e6%80%a7%e9%80%9f%e8%a7%88-2\/","title":{"rendered":"\u7b2c 2 \u8bfe Java 21 \u65b0\u7279\u6027\u901f\u89c8"},"content":{"rendered":"<h1>\u7b2c 2 \u8bfe Java 21 \u65b0\u7279\u6027\u901f\u89c8<\/h1>\n<blockquote>\n<p>\u672c\u8bfe\u8bb2\u89e3 Java 21\uff08\u9879\u76ee\u8981\u6c42\u7684 JDK \u7248\u672c\uff09\u7684\u65b0\u7279\u6027\u3002\u91cd\u70b9\u4e0d\u662f\u300c\u80cc\u5b8c\u6240\u6709\u65b0\u7279\u6027\u300d\uff0c\u800c\u662f\uff1a<strong>\u9879\u76ee\u771f\u5b9e\u7528\u5230\u4e86\u54ea\u4e9b\u3001\u4f60\u8be5\u77e5\u9053\u54ea\u4e9b<\/strong>\u3002\u5b66\u5b8c\u4f60\u4f1a\u5bf9\u300c\u8fd9\u4e2a\u9879\u76ee\u4e3a\u4ec0\u4e48\u8981\u6c42 Java 21\u300d\u6709\u6e05\u6670\u7684\u7b54\u6848\u3002<\/p>\n<\/blockquote>\n<hr \/>\n<h2>\u672c\u8bfe\u5b66\u4e60\u76ee\u6807<\/h2>\n<p>\u5b8c\u6210\u672c\u8bfe\u540e\uff0c\u4f60\u5c06\u80fd\u591f\uff1a<\/p>\n<ol>\n<li>\u8bf4\u6e05 Java 21 \u662f\u4ec0\u4e48\u3001\u4e3a\u4ec0\u4e48\u9879\u76ee\u8981\u6c42\u5b83<\/li>\n<li>\u6307\u51fa\u9879\u76ee<strong>\u771f\u6b63\u7528\u5230<\/strong>\u7684 3 \u4e2a Java 21 \u65b0\u7279\u6027\uff0c\u5e76\u770b\u61c2\u5bf9\u5e94\u4ee3\u7801<\/li>\n<li>\u8ba4\u8bc6 record\u3001sealed\u3001\u865a\u62df\u7ebf\u7a0b\u7b49\u300c\u53ef\u7528\u4f46\u672c\u9879\u76ee\u6ca1\u7528\u5230\u300d\u7684\u7279\u6027<\/li>\n<li>\u5efa\u7acb\u300c\u4ee5\u6e90\u7801\u4e3a\u51c6\u300d\u7684\u8ba4\u77e5\uff1a\u6587\u6863\u8bf4\u7528\u4e86 \u2260 \u4ee3\u7801\u771f\u7684\u7528\u4e86<\/li>\n<\/ol>\n<hr \/>\n<h2>\u4e00\u3001\u77e5\u8bc6\u70b9\u8be6\u89e3<\/h2>\n<h3>1.1 Java 21 \u662f\u4ec0\u4e48<\/h3>\n<p>Java 21 \u662f <strong>2023 \u5e74 9 \u6708\u53d1\u5e03\u7684 LTS\uff08\u957f\u671f\u652f\u6301\uff09\u7248\u672c<\/strong>\uff0c\u662f\u7ee7 Java 17 \u4e4b\u540e\u7684\u7b2c\u4e8c\u4e2a\u4e3b\u6d41 LTS\uff0c\u4e5f\u662f\u5f88\u591a\u65b0\u9879\u76ee\u9ed8\u8ba4\u9009\u62e9\u7684\u7248\u672c\u3002\u5b83\u672c\u8eab\u6ca1\u6709\u300c\u9769\u547d\u6027\u300d\u8bed\u6cd5\u5927\u6539\uff0c\u800c\u662f\u5728 Java 8-17 \u7d2f\u79ef\u7684\u4f17\u591a\u65b0\u7279\u6027\u57fa\u7840\u4e0a\u505a\u4e86<strong>\u6700\u7ec8\u5b9a\u578b<\/strong>\u3002<\/p>\n<p>\u672c\u9879\u76ee\u5728\u6839 <code>pom.xml<\/code> \u91cc\u58f0\u660e\uff1a<\/p>\n<pre><code class=\"language-xml\">&lt;properties&gt;\n    &lt;java.version&gt;21&lt;\/java.version&gt;\n&lt;\/properties&gt;<\/code><\/pre>\n<p>\u4e5f\u5c31\u662f\u8bf4\uff1a<strong>\u8fd9\u4e2a\u9879\u76ee\u5fc5\u987b\u7528 JDK 21 \u7f16\u8bd1\u8fd0\u884c<\/strong>\uff0c\u4f4e\u4e8e 21 \u65e0\u6cd5\u6784\u5efa\u3002\u8fd9\u662f\u300c\u4e3a\u4ec0\u4e48\u7b2c 1 \u8bfe\u8981\u6c42\u88c5 JDK 21\u300d\u7684\u539f\u56e0\u3002<\/p>\n<blockquote>\n<p>\u9700\u8981\u5148\u8bf4\u660e\u4e00\u4e2a\u771f\u76f8\uff1a<strong>novel-plus \u7684\u4ee3\u7801\u98ce\u683c\u5176\u5b9e\u504f\u300c\u4fdd\u5b88\u300d<\/strong>\u2014\u2014\u7edd\u5927\u591a\u6570\u4ee3\u7801\u8fd8\u662f\u4f20\u7edf Java 8 \u98ce\u683c\uff08<code>Map<\/code>\u3001getter\/setter\u3001<code>new ArrayList<\/code> \u7b49\uff09\u3002\u5b83\u53ea\u96f6\u661f\u7528\u4e86\u5c11\u6570\u65b0\u7279\u6027\u3002\u6240\u4ee5\u672c\u8bfe\u5206\u4e24\u7c7b\u8bb2\uff1a<strong>\u9879\u76ee\u771f\u6b63\u7528\u7684<\/strong> \u548c <strong>\u4f60\u9700\u8981\u77e5\u9053\u4f46\u9879\u76ee\u6ca1\u7528\u5230\u7684<\/strong>\u3002<\/p>\n<\/blockquote>\n<h3>1.2 \u9879\u76ee\u771f\u6b63\u7528\u5230\u7684 3 \u4e2a\u65b0\u7279\u6027\uff08\u91cd\u70b9\uff09<\/h3>\n<h4>\u2460 \u6587\u672c\u5757\uff08Text Blocks\uff09<\/h4>\n<p><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u7528 <code>\"\"\"<\/code> \u5305\u88f9\u591a\u884c\u5b57\u7b26\u4e32\uff0c\u4e0d\u7528\u518d\u5199\u4e00\u5806 <code>n<\/code> \u548c\u8f6c\u4e49\uff0c\u7f29\u8fdb\u4e5f\u4f1a\u81ea\u52a8\u5bf9\u9f50\u3002Java 15 \u8d77\u6b63\u5f0f\u53ef\u7528\u3002<\/p>\n<p><strong>\u9879\u76ee\u91cc\u7684\u771f\u5b9e\u4f8b\u5b50<\/strong> \u2014\u2014 <code>novel-front\/...\/service\/impl\/LikeServiceImpl.java<\/code>\uff08\u7b2c 35 \u884c\u9644\u8fd1\uff09\uff1a<\/p>\n<pre><code class=\"language-java\">@PostConstruct\npublic void init() {\n    \/\/ Lua \u811a\u672c\u4fdd\u8bc1\u539f\u5b50\u6027\u64cd\u4f5c\n    String script = \"\"\"\n            local key = KEYS[1]\n            local userId = ARGV[1]\n\n            local isLiked = redis.call('SISMEMBER', key, userId)\n\n            if isLiked == 1 then\n                redis.call('SREM', key, userId)\n            else\n                redis.call('SADD', key, userId)\n            end\n\n            return redis.call('SCARD', key)\n        \"\"\";\n    ...\n}<\/code><\/pre>\n<p><strong>\u4e3a\u4ec0\u4e48\u8fd9\u91cc\u7528\u6587\u672c\u5757<\/strong>\uff1a\u8fd9\u6bb5 Lua \u811a\u672c\u5929\u7136\u662f\u591a\u884c\u3001\u6709\u7f29\u8fdb\u3001\u542b\u5355\u5f15\u53f7\u7684\u4ee3\u7801\uff0c\u7528\u4f20\u7edf\u5b57\u7b26\u4e32\u5199\u8981\u624b\u62fc\u6362\u884c\u3001\u6781\u6613\u51fa\u9519\uff1b\u6587\u672c\u5757\u8ba9\u5b83\u300c\u6240\u89c1\u5373\u6240\u5f97\u300d\u3002\u8fd9\u4e5f\u662f\u70b9\u8d5e\u529f\u80fd\u7684\u539f\u5b50\u64cd\u4f5c\uff08\u70b9\u8d5e\/\u53d6\u6d88\u8d5e\u5171\u7528\u4e00\u6bb5 Redis Lua \u811a\u672c\uff09\u3002<\/p>\n<h4>\u2461 instanceof \u6a21\u5f0f\u5339\u914d\uff08Pattern Matching for instanceof\uff09<\/h4>\n<p><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a<code>instanceof<\/code> \u5224\u65ad\u7c7b\u578b\u540e<strong>\u76f4\u63a5\u58f0\u660e\u53d8\u91cf<\/strong>\uff0c\u7701\u6389\u540e\u7eed\u624b\u52a8\u5f3a\u5236\u8f6c\u6362\u3002Java 16 \u8d77\u6b63\u5f0f\u53ef\u7528\u3002<\/p>\n<p><strong>\u9879\u76ee\u91cc\u7684\u771f\u5b9e\u4f8b\u5b50<\/strong> \u2014\u2014 <code>novel-admin\/...\/common\/aspect\/MapSortValidationAspect.java<\/code>\uff08\u7b2c 56-60 \u884c\uff09\uff1a<\/p>\n<pre><code class=\"language-java\">if (hasAnnotation &amp;&amp; args[i] instanceof Map map) {          \/\/ \u5224\u65ad + \u7ed1\u5b9a\u53d8\u91cf map\n    if (map.get(\"sort\") instanceof String sortStr) {          \/\/ \u5224\u65ad + \u7ed1\u5b9a\u53d8\u91cf sortStr\n        map.put(\"sort\", SortWhitelistUtil.sanitizeColumn(sortStr));\n    }\n    if (map.get(\"order\") instanceof String orderStr) {\n        map.put(\"order\", SortWhitelistUtil.sanitizeOrder(orderStr));\n    }\n}<\/code><\/pre>\n<p><strong>\u548c\u65e7\u5199\u6cd5\u7684\u533a\u522b<\/strong>\uff1a<\/p>\n<pre><code class=\"language-java\">\/\/ \u65e7\u5199\u6cd5\uff1a\u5224\u65ad + \u624b\u52a8\u5f3a\u8f6c\nif (args[i] instanceof Map) {\n    Map map = (Map) args[i];\n    ...\n}\n\/\/ \u65b0\u5199\u6cd5\uff1a\u4e00\u6b65\u5230\u4f4d\nif (args[i] instanceof Map map) { ... }<\/code><\/pre>\n<p>\u8fd9\u91cc\u8fd8\u987a\u5e26\u4f53\u73b0\u4e86 <strong>Lambda + Stream<\/strong>\uff08<code>Arrays.stream(parameterAnnotations[i]).anyMatch(...)<\/code>\uff09\uff0c\u540e\u9762 1.3 \u4f1a\u518d\u63d0\u3002<\/p>\n<h4>\u2462 \u589e\u5f3a switch \u8868\u8fbe\u5f0f\uff08Switch Expressions\uff09<\/h4>\n<p><strong>\u662f\u4ec0\u4e48<\/strong>\uff1aswitch \u65e2\u53ef\u4ee5\u5f53\u300c\u8bed\u53e5\u300d\u4e5f\u53ef\u4ee5\u5f53\u300c\u8868\u8fbe\u5f0f\u300d\uff08\u6709\u8fd4\u56de\u503c\uff09\uff0c\u7528 <code>-&gt;<\/code> \u7bad\u5934\u6807\u7b7e\uff0c\u4e0d\u9700\u8981 <code>break<\/code>\u3002Java 14 \u8d77\u6b63\u5f0f\u53ef\u7528\u3002<\/p>\n<p><strong>\u9879\u76ee\u91cc\u7684\u771f\u5b9e\u4f8b\u5b50<\/strong> \u2014\u2014 <code>novel-crawl\/...\/core\/schedule\/DiskMonitorSchedule.java<\/code>\uff08\u7b2c 91-96 \u884c\uff09\uff1a<\/p>\n<pre><code class=\"language-java\">private String getAlertLevelText(String level) {\n    return switch (level) {\n        case \"CRITICAL\" -&gt; \"\u4e25\u91cd\";\n        case \"WARNING\" -&gt; \"\u8b66\u544a\";\n        case \"INFO\" -&gt; \"\u63d0\u793a\";\n        default -&gt; \"\u901a\u77e5\";\n    };\n}<\/code><\/pre>\n<p><strong>\u548c\u65e7\u5199\u6cd5\u7684\u533a\u522b<\/strong>\uff1a<\/p>\n<pre><code class=\"language-java\">\/\/ \u65e7\u5199\u6cd5\uff1a\u8bed\u53e5 + break\uff0c\u5bb9\u6613\u6f0f break\nString text;\nswitch (level) {\n    case \"CRITICAL\": text = \"\u4e25\u91cd\"; break;\n    case \"WARNING\":  text = \"\u8b66\u544a\"; break;\n    default:         text = \"\u901a\u77e5\";\n}\n\/\/ \u65b0\u5199\u6cd5\uff1a\u8868\u8fbe\u5f0f\u76f4\u63a5\u8fd4\u56de\u503c\nreturn switch (level) {\n    case \"CRITICAL\" -&gt; \"\u4e25\u91cd\";\n    default         -&gt; \"\u901a\u77e5\";\n};<\/code><\/pre>\n<p><code>DiskMonitorSchedule<\/code> \u662f\u4e00\u4e2a<strong>\u78c1\u76d8\u76d1\u63a7\u5b9a\u65f6\u4efb\u52a1<\/strong>\uff08\u722c\u866b\u6a21\u5757\u4e13\u7528\uff09\uff0c\u540c\u4e00\u4e2a <code>switch (level)<\/code> \u5957\u8def\u5728\u6587\u4ef6\u91cc\u5199\u4e86 5 \u5904\uff0c\u5206\u522b\u628a\u7b49\u7ea7\u8f6c\u6210\u4e2d\u6587\u3001\u56fe\u6807\u3001\u989c\u8272\u3001\u90ae\u4ef6\u6b63\u6587\u7b49\u2014\u2014\u662f\u89c2\u5bdf switch \u8868\u8fbe\u5f0f\u7684\u6700\u4f73\u6837\u672c\u3002<\/p>\n<h3>1.3 \u9879\u76ee\u5927\u91cf\u4f7f\u7528\u7684\u300c\u73b0\u4ee3 Java \u7279\u6027\u300d\uff08\u975e 21 \u4e13\u5c5e\uff0c\u5feb\u901f\u5e26\u8fc7\uff09<\/h3>\n<p>\u8fd9\u4e9b\u4e0d\u662f Java 21 \u624d\u6709\u7684\uff0c\u4f46\u9879\u76ee\u5230\u5904\u5728\u7528\uff0c\u503c\u5f97\u5728\u5b66\u6e90\u7801\u524d\u5fc3\u91cc\u6709\u6570\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u7279\u6027<\/th>\n<th>\u9879\u76ee\u4f4d\u7f6e<\/th>\n<th>\u4e00\u53e5\u8bdd\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Lambda + Stream<\/td>\n<td><code>MapSortValidationAspect<\/code>\u3001<code>PageController<\/code><\/td>\n<td>\u51fd\u6570\u5f0f\u5904\u7406\u96c6\u5408\uff0c\u66ff\u4ee3 for \u5faa\u73af<\/td>\n<\/tr>\n<tr>\n<td>Optional<\/td>\n<td><code>novel-crawl\/...\/core\/crawl\/CrawlParser.java<\/code><\/td>\n<td>\u4f18\u96c5\u5904\u7406\u300c\u53ef\u80fd\u4e3a\u7a7a\u300d\uff0c\u94fe\u5f0f\u8c03\u7528<\/td>\n<\/tr>\n<tr>\n<td>CompletableFuture<\/td>\n<td><code>novel-front\/...\/controller\/page\/PageController.java<\/code><\/td>\n<td>\u5f02\u6b65\u5e76\u884c\u52a0\u8f7d\u9996\u9875\u6570\u636e\uff0c\u63d0\u5347\u6027\u80fd<\/td>\n<\/tr>\n<tr>\n<td>try-with-resources<\/td>\n<td>\u5404\u6a21\u5757\uff08\u5982\u6570\u636e\u5e93\u8fde\u63a5\u3001\u6d41\uff09<\/td>\n<td>\u8d44\u6e90\u81ea\u52a8\u5173\u95ed\uff0c\u65e0\u9700 finally<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote>\n<p>\u8fd9\u4e9b\u5728\u540e\u7eed\u8bfe\u7a0b\uff08\u5982\u7b2c 13 \u8bfe\u8bf7\u6c42\u94fe\u8def\u3001\u7b2c 26 \u8bfe\u5f02\u6b65\uff09\u4f1a\u5c55\u5f00\uff0c\u672c\u8bfe\u5148\u8ba4\u8bc6\u5b83\u4eec\u5b58\u5728\u3002<\/p>\n<\/blockquote>\n<h3>1.4 \u5927\u7eb2\u63d0\u5230\u3001\u4f46\u9879\u76ee\u5176\u5b9e\u6ca1\u7528\u5230\u7684\u65b0\u7279\u6027\uff08\u4e86\u89e3\u5373\u53ef\uff09<\/h3>\n<p>\u672c\u8bfe\u7a0b\u5927\u7eb2\u548c <code>doc\/tech-stack-learning-roadmap.md<\/code> 2.1 \u8282\u90fd\u63d0\u5230\u300cRecord\u3001Sealed Class \u7b49\u300d\u2014\u2014\u4f46<strong>\u6211\u6838\u5b9e\u8fc7\u5168\u90e8\u6e90\u7801\uff0c\u9879\u76ee\u91cc\u5e76\u6ca1\u6709\u58f0\u660e\u4efb\u4f55 record \/ sealed \u7c7b\uff0c\u4e5f\u6ca1\u6709\u865a\u62df\u7ebf\u7a0b\u548c var<\/strong>\u3002\u8fd9\u662f\u5f88\u597d\u7684\u5b9e\u6218\u63d0\u9192\uff1a<strong>\u8bfb\u6587\u6863\u8981\u6709\u6000\u7591\u7cbe\u795e\uff0c\u4ee5\u6e90\u7801\u4e3a\u51c6<\/strong>\u3002<\/p>\n<p>\u8fd9\u51e0\u4e2a\u7279\u6027\u4f60\u4ecd\u7136\u5e94\u8be5\u77e5\u9053\uff08\u9762\u8bd5\u548c\u5199\u65b0\u4ee3\u7801\u4f1a\u7528\uff09\uff1a<\/p>\n<ul>\n<li>\n<p><strong>record\uff08\u8bb0\u5f55\u7c7b\uff09<\/strong>\uff1a\u4e00\u53e5\u8bdd\u5b9a\u4e49\u300c\u4e0d\u53ef\u53d8\u6570\u636e\u7c7b\u300d\uff0c\u81ea\u52a8\u751f\u6210\u6784\u9020\u5668\u3001getter\u3001equals\/hashCode\/toString\uff1a<\/p>\n<pre><code class=\"language-java\">record BookInfo(String bookName, int wordCount) { }\n\/\/ \u81ea\u52a8\u83b7\u5f97 new BookInfo(\"\u6597\u7834\", 3000) \u548c bookInfo.bookName()<\/code><\/pre>\n<p>\u9879\u76ee\u6ca1\u7528\uff08\u5b9e\u4f53\u7c7b\u90fd\u662f\u4f20\u7edf POJO + Lombok \u7684 <code>@Data<\/code>\uff09\uff0c\u4f46\u65b0\u4ee3\u7801\u91cc\u5b83\u662f\u300cDTO\/VO\u300d\u7684\u6700\u4f73\u66ff\u4ee3\u3002<\/p>\n<\/li>\n<li>\n<p><strong>sealed\uff08\u5bc6\u5c01\u7c7b\/\u63a5\u53e3\uff09<\/strong>\uff1a\u9650\u5236\u4e00\u4e2a\u7c7b\u7684\u5b50\u7c7b\u5fc5\u987b\u7531\u81ea\u5df1\u58f0\u660e\uff1a<\/p>\n<pre><code class=\"language-java\">sealed interface CrawlSource permits AibiSource, QidianSource { }<\/code><\/pre>\n<p>\u9879\u76ee\u672a\u7528\uff08\u722c\u866b\u6e90\u4e4b\u95f4\u6ca1\u6709\u8fd9\u79cd\u5f3a\u7ea6\u675f\uff09\u3002<\/p>\n<\/li>\n<li>\n<p><strong>\u865a\u62df\u7ebf\u7a0b\uff08Virtual Threads\uff09<\/strong>\uff1a\u8f7b\u91cf\u7ea7\u7ebf\u7a0b\uff0c\u53ef\u521b\u5efa\u6210\u5343\u4e0a\u4e07\u4e2a\u5904\u7406 IO\uff0cJava 21 \u7684\u6740\u624b\u950f\u3002\u9879\u76ee\u672a\u7528\uff08\u4ecd\u662f\u4f20\u7edf\u7ebf\u7a0b\u6c60\uff0c\u89c1\u7b2c 26 \u8bfe <code>ThreadPoolConfig<\/code>\uff09\u3002<\/p>\n<\/li>\n<li>\n<p><strong>var\uff08\u5c40\u90e8\u53d8\u91cf\u7c7b\u578b\u63a8\u65ad\uff09<\/strong>\uff1aJava 10 \u5c31\u6709\uff0c<code>var list = new ArrayList&lt;String&gt;();<\/code> \u9879\u76ee\u672a\u7528\uff08\u98ce\u683c\u4fdd\u5b88\uff09\u3002<\/p>\n<\/li>\n<li>\n<p><strong>switch \u6a21\u5f0f\u5339\u914d<\/strong>\uff1a<code>case String s -&gt; ...<\/code> \u76f4\u63a5\u5728 switch \u91cc\u89e3\u6784\u7c7b\u578b\uff0c\u9879\u76ee\u672a\u7528\u3002<\/p>\n<\/li>\n<\/ul>\n<h3>1.5 \u5c0f\u7ed3\uff1a\u4e3a\u4ec0\u4e48\u300c\u8981\u6c42 Java 21\u300d\u5374\u300c\u7528\u5f97\u5c11\u300d<\/h3>\n<ul>\n<li><strong>\u8981\u6c42 Java 21<\/strong>\uff1a\u73b0\u4ee3 LTS\uff0c\u5b89\u5168\u3001\u6027\u80fd\u597d\u3001\u751f\u6001\u9ed8\u8ba4\u7248\u672c\uff1b\u9879\u76ee\u65b9\u4ece Java 8 \u5347\u7ea7\u4e0a\u6765\u7684\u3002<\/li>\n<li><strong>\u7528\u5f97\u5c11<\/strong>\uff1a\u8001\u4ee3\u7801\u98ce\u683c\u8fc1\u79fb\u6210\u672c\u9ad8\uff0c\u53ea\u5728\u987a\u624b\u5904\u7528\u65b0\u7279\u6027\u3002<\/li>\n<li><strong>\u5bf9\u4f60\u7684\u610f\u4e49<\/strong>\uff1a\u4e8c\u6b21\u5f00\u53d1\u65f6<strong>\u53ef\u4ee5\u653e\u5fc3\u7528<\/strong> record \/ switch \u8868\u8fbe\u5f0f \/ \u6587\u672c\u5757\uff08JDK 21 \u90fd\u652f\u6301\uff09\uff0c\u4e5f\u80fd\u8bfb\u61c2\u9879\u76ee\u91cc\u90a3 3 \u5904\u65b0\u7279\u6027\u4ee3\u7801\u3002<strong>\u77e5\u9053\u662f\u4ec0\u4e48 + \u80fd\u5728\u6e90\u7801\u91cc\u8ba4\u51fa\u6765<\/strong>\uff0c\u5c31\u591f\u672c\u8bfe\u76ee\u6807\u4e86\u3002<\/li>\n<\/ul>\n<hr \/>\n<h2>\u4e8c\u3001\u52a8\u624b\u7ec3\u4e60\uff08\u542b\u9a8c\u8bc1\u6807\u51c6\uff09<\/h2>\n<blockquote>\n<p>\u505a\u5b8c\u4e00\u9879\u52fe\u4e00\u9879\u3002<\/p>\n<\/blockquote>\n<h3>\u7ec3\u4e60 1\uff1a\u5b9a\u4f4d\u6e90\u7801\u4e2d\u7684\u65b0\u7279\u6027<\/h3>\n<ul>\n<li><strong>\u76ee\u6807<\/strong>\uff1a\u5728 IDE \u91cc\u627e\u5230\u672c\u8bfe\u8bb2\u5230\u7684 3 \u5904\u65b0\u7279\u6027\u4ee3\u7801\uff0c\u9010\u4e00\u8bfb\u61c2\u3002<\/li>\n<li><strong>\u6b65\u9aa4<\/strong>\uff1a\u7528 Ctrl+Shift+N \u6253\u5f00 <code>LikeServiceImpl<\/code>\u3001<code>MapSortValidationAspect<\/code>\u3001<code>DiskMonitorSchedule<\/code>\uff0c\u8df3\u5230\u5bf9\u5e94\u884c\uff0835 \/ 56-60 \/ 91-96\uff09\uff0c\u5bf9\u7167\u672c\u8bfe\u8bb2\u89e3\u770b\u4e00\u904d\u3002<\/li>\n<li><strong>\u9a8c\u8bc1\u6807\u51c6<\/strong>\uff1a\u80fd\u4e0d\u770b\u672c\u6587\u8bf4\u51fa\u2014\u2014\u4e09\u5904\u5206\u522b\u7528\u4e86\u4ec0\u4e48\u7279\u6027\u3001\u5206\u522b\u89e3\u51b3\u4e86\u4ec0\u4e48\u95ee\u9898\uff08Lua \u591a\u884c\u811a\u672c \/ \u514d\u5f3a\u8f6c \/ switch \u8fd4\u56de\u503c\uff09\u3002<\/li>\n<\/ul>\n<h3>\u7ec3\u4e60 2\uff1a\u4e0a\u624b\u65b0\u7279\u6027\uff08\u5199 5 \u5206\u949f\u5c0f\u4ee3\u7801\uff09<\/h3>\n<ul>\n<li><strong>\u76ee\u6807<\/strong>\uff1a\u4eb2\u624b\u5199 record \u548c\u6587\u672c\u5757\uff0c\u786e\u8ba4\u7f16\u8bd1\u8fd0\u884c\u3002<\/li>\n<li>\n<p><strong>\u6b65\u9aa4<\/strong>\uff1a\u4efb\u610f\u5efa\u4e00\u4e2a Java \u7c7b\uff08\u53ef\u7528 IDEA \u7684\u4e34\u65f6 Scratch File\uff09\uff1a<\/p>\n<pre><code class=\"language-java\">record BookInfo(String bookName, int wordCount) { }\n\npublic class Test {\n  public static void main(String[] args) {\n      var b = new BookInfo(\"\u6597\u7834\u82cd\u7a79\", 3000);   \/\/ record + var\n      String tip = \"\"\"\n          \u4e66\u540d\uff1a%s\n          \u5b57\u6570\uff1a%d\n          \"\"\".formatted(b.bookName(), b.wordCount());   \/\/ \u6587\u672c\u5757\n      System.out.println(tip);\n  }\n}<\/code><\/pre>\n<\/li>\n<li><strong>\u9a8c\u8bc1\u6807\u51c6<\/strong>\uff1a\u7f16\u8bd1\u901a\u8fc7\uff0c\u8f93\u51fa\u4e24\u884c\u5185\u5bb9\uff1b\u8bf4\u660e record \u81ea\u52a8\u751f\u6210\u4e86 <code>bookName()<\/code> \u7b49\u8bbf\u95ee\u65b9\u6cd5\u3002<\/li>\n<\/ul>\n<h3>\u7ec3\u4e60 3\uff1a\u628a\u4f20\u7edf switch \u6539\u5199\u6210 switch \u8868\u8fbe\u5f0f<\/h3>\n<ul>\n<li><strong>\u76ee\u6807<\/strong>\uff1a\u5b66\u4f1a\u65b0\u5199\u6cd5\uff0c\u4e14\u4fdd\u8bc1\u884c\u4e3a\u4e0d\u53d8\u3002<\/li>\n<li><strong>\u6b65\u9aa4<\/strong>\uff1a\u6253\u5f00 <code>novel-front\/...\/controller\/CacheController.java<\/code>\uff08\u7b2c 48 \u884c <code>switch (type)<\/code>\uff09\u6216 <code>BookServiceImpl.java<\/code>\uff08\u7b2c 324 \u884c <code>switch (type)<\/code>\uff09\uff0c\u5728\u8349\u7a3f\u91cc\u628a\u4f20\u7edf <code>case x: ... break;<\/code> \u6539\u5199\u4e3a <code>-&gt;<\/code> \u7bad\u5934\u5f62\u5f0f\u3002<\/li>\n<li><strong>\u9a8c\u8bc1\u6807\u51c6<\/strong>\uff1a\u6539\u5199\u540e\u903b\u8f91\u7b49\u4ef7\uff08\u5bf9\u7167\u539f switch \u6bcf\u4e2a\u5206\u652f\u7684\u503c\uff09\uff0c\u80fd\u8bb2\u51fa <code>-&gt;<\/code> \u5206\u652f\u4e3a\u4ec0\u4e48\u4e0d\u9700\u8981 <code>break<\/code>\u3002<\/li>\n<li><strong>\u6ce8\u610f<\/strong>\uff1a\u7ec3\u4e60\u662f\u300c\u5728\u8349\u7a3f\u91cc\u6539\u7740\u73a9\u300d\uff0c\u4e0d\u5fc5\u771f\u7684\u6539\u9879\u76ee\u6587\u4ef6\u3002<\/li>\n<\/ul>\n<hr \/>\n<h2>\u4e09\u3001\u672c\u8bfe\u5c0f\u7ed3<\/h2>\n<p>novel-plus \u8981\u6c42 JDK 21\uff0c\u4f46\u4ee3\u7801\u98ce\u683c\u504f\u4fdd\u5b88\uff1a<strong>\u771f\u6b63\u7528\u5230\u7684\u65b0\u7279\u6027\u53ea\u6709 3 \u5904<\/strong>\u2014\u2014\u6587\u672c\u5757\uff08LikeServiceImpl \u7684 Lua \u811a\u672c\uff09\u3001instanceof \u6a21\u5f0f\u5339\u914d\uff08MapSortValidationAspect \u514d\u5f3a\u8f6c\uff09\u3001\u589e\u5f3a switch \u8868\u8fbe\u5f0f\uff08DiskMonitorSchedule \u7684\u78c1\u76d8\u544a\u8b66\u6587\u6848\uff09\u3002\u5176\u4f59\u73b0\u4ee3\u7279\u6027\uff08Lambda\/Stream\/Optional\/CompletableFuture\uff09\u9879\u76ee\u5927\u91cf\u4f7f\u7528\u4f46\u975e 21 \u4e13\u5c5e\uff1brecord\u3001sealed\u3001\u865a\u62df\u7ebf\u7a0b\u3001var \u7b49\u300c\u53ef\u7528\u672a\u7528\u300d\u3002<strong>\u5224\u65ad\u4e00\u4e2a\u6280\u672f\u7528\u6ca1\u7528\uff0c\u4ee5\u6e90\u7801\u4e3a\u51c6\uff0c\u522b\u5168\u4fe1\u6587\u6863<\/strong>\u3002<\/p>\n<hr \/>\n<h2>\u56db\u3001\u81ea\u6d4b\u9898<\/h2>\n<ol>\n<li>\u3010\u9009\u62e9\u3011\u9879\u76ee\u91cc\u6587\u672c\u5757\u7528\u5728\u54ea\u91cc\uff1f\uff08A. <code>DiskMonitorSchedule<\/code> \u3000B. <code>LikeServiceImpl<\/code>\u3000C. <code>MapSortValidationAspect<\/code>\u3000D. <code>CrawlParser<\/code>\uff09<\/li>\n<li>\u3010\u9009\u62e9\u3011\u589e\u5f3a switch \u8868\u8fbe\u5f0f\u7528\u54ea\u4e2a\u7b26\u53f7\u4f5c\u4e3a\u5206\u652f\u6807\u7b7e\uff1f\uff08A. <code>:<\/code>\u3000B. <code>::<\/code>\u3000C. <code>-&gt;<\/code>\u3000D. <code>=&gt;<\/code>\uff09<\/li>\n<li>\u3010\u9009\u62e9\u3011record \u7684\u4e3b\u8981\u7528\u9014\u662f\uff1f\uff08A. \u591a\u7ebf\u7a0b\u5e76\u53d1\u3000B. \u4e00\u53e5\u8bdd\u5b9a\u4e49\u4e0d\u53ef\u53d8\u6570\u636e\u7c7b\u3000C. \u5b57\u7b26\u4e32\u6a21\u677f\u3000D. \u7c7b\u578b\u63a8\u65ad\uff09<\/li>\n<li>\u3010\u7b80\u7b54\u3011\u4e3a\u4ec0\u4e48\u8bf4\u300c\u6587\u6863\u58f0\u79f0\u9879\u76ee\u7528\u4e86 Record\/Sealed\uff0c\u4f46\u5b9e\u9645\u6ca1\u6709\u300d\uff1f\u5b66\u4e60\u65f6\u5e94\u8be5\u4ee5\u4ec0\u4e48\u4e3a\u51c6\uff1f<\/li>\n<li>\u3010\u7b80\u7b54\u3011<code>instanceof Map map<\/code> \u6bd4 <code>instanceof Map<\/code> \u7701\u6389\u4e86\u54ea\u4e00\u6b65\uff1f<\/li>\n<\/ol>\n<blockquote>\n<p>\u7b54\u6848\uff1a1-B\uff08\u89c1 1.2\u2460\uff09\u30012-C\uff08\u89c1 1.2\u2462\uff09\u30013-B\uff08\u89c1 1.4\uff09\u30014-\u6e90\u7801\u4e3a\u51c6\uff08\u89c1 1.4 \u5f15\u8a00\uff09\u30015-\u624b\u52a8\u5f3a\u8f6c\uff08\u89c1 1.2\u2461\uff09\u3002<\/p>\n<\/blockquote>\n<hr \/>\n<h2>\u4e94\u3001\u53c2\u8003\u8d44\u6e90<\/h2>\n<ul>\n<li>\u672c\u8bfe\u7a0b\u5927\u7eb2\uff1a<code>Tutorial\/\u8bfe\u7a0b\u5927\u7eb2-30\u8282\u8bfe.md<\/code> \u2192 \u7b2c 2 \u8bfe<\/li>\n<li>\u6280\u672f\u6808\u8def\u7ebf\uff1a<code>doc\/tech-stack-learning-roadmap.md<\/code> \u2192 2.1 \u8282 Java 21\uff08\u6ce8\u610f\u5176 Record\/Sealed \u8bf4\u6cd5\u4e0e\u6e90\u7801\u4e0d\u7b26\uff09<\/li>\n<li>\u5b98\u65b9\u6587\u6863\uff1aOracle Java 21 \u8bed\u8a00\u7279\u6027\uff08docs.oracle.com\/en\/java\/javase\/21\uff09<\/li>\n<li>\u4e66\u76ee\uff1a\u300aJava \u6838\u5fc3\u6280\u672f \u5377 I\u300b\u7b2c 12 \u7248\uff08\u8986\u76d6 Java 17-21 \u65b0\u7279\u6027\uff09<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c 2 \u8bfe Java 21 \u65b0\u7279\u6027\u901f\u89c8 \u672c\u8bfe\u8bb2\u89e3 Java 21\uff08\u9879\u76ee\u8981\u6c42\u7684 JDK \u7248\u672c\uff09\u7684\u65b0\u7279\u6027\u3002\u91cd\u70b9\u4e0d\u662f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[22],"class_list":["post-577","post","type-post","status-publish","format-standard","hentry","category-project","tag-22"],"_links":{"self":[{"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/posts\/577","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/comments?post=577"}],"version-history":[{"count":0,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/posts\/577\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/media?parent=577"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/categories?post=577"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/tags?post=577"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}