国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) Java java教程 JBang,Java 生態(tài)系統(tǒng)中缺失的腳本工具

JBang,Java 生態(tài)系統(tǒng)中缺失的腳本工具

Jan 05, 2025 am 04:01 AM

Java生態(tài)已經(jīng)有兩個(gè)強(qiáng)大的項(xiàng)目管理工具,Maven和Gradle,但缺少一個(gè)簡(jiǎn)單而強(qiáng)大的腳本工具。
這就是 JBang 發(fā)揮作用的地方。
它是一個(gè)簡(jiǎn)約但功能強(qiáng)大的 Java、Kotlin 和 Groovy 文件啟動(dòng)器。
事實(shí)上,它允許您像運(yùn)行腳本一樣輕松地運(yùn)行代碼。
它還提供許多其他功能,例如依賴管理、模板和 App Store。
讓我們?cè)谶@篇文章中探索 JBang 及其功能。

設(shè)置

jbang 命令行可以使用不同的方法安裝在 Windows、Linux 和 macOS 上,這些方法在此處有詳細(xì)記錄。
我們可以通過(guò)運(yùn)行 jbang --version 來(lái)驗(yàn)證安裝。

除此之外,最好為我們最喜??歡的 IDE 安裝隨附的 IDE 擴(kuò)展。
此處列出了支持的 IDE 擴(kuò)展。

JBang 不依賴于 JDK 到 JRE,但運(yùn)行使用 Java 的腳本需要 JDK。
您可以通過(guò)運(yùn)行 jbang jdk install 23 來(lái)安裝 JBang,這將安裝 JDK 23。

我們現(xiàn)在準(zhǔn)備編寫我們的第一個(gè)腳本。

第一個(gè)腳本

讓我們創(chuàng)建一個(gè)簡(jiǎn)單的腳本來(lái)打印“Hello, World!”到控制臺(tái)。

> jbang init helloworld.java

這將創(chuàng)建一個(gè)名為 helloworld.java 的文件,可以使用 jbang helloworld.java 運(yùn)行。

> jbang helloworld.java
Hello world

當(dāng)您打開(kāi)該文件時(shí),您將看到它是一個(gè)普通的 Java 文件,帶有 main 方法和特定的第一行。

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

正如我們將看到的,JBang 腳本由三部分組成:shebang、可選屬性和腳本本身。
我們將在接下來(lái)的部分中使用第二部分的一些屬性,但讓我們重點(diǎn)關(guān)注第一部分。

這部分 ///usr/bin/env jbang "$0" "$@" ;退出$?告訴系統(tǒng)使用 JBang 來(lái)運(yùn)行腳本。
它在 Unix 生態(tài)系統(tǒng)中被稱為 shebang,用于指定腳本的解釋器。
我們可以在 Unix 系統(tǒng)(macOS、Linux)上通過(guò)運(yùn)行 chmod x helloworld.java 使腳本可執(zhí)行,然后運(yùn)行 ??./helloworld.java 來(lái)說(shuō)明這一點(diǎn)。

/// usr/bin/env jbang "<pre class="brush:php;toolbar:false">///usr/bin/env jbang "<pre class="brush:php;toolbar:false">//JAVA 23+
//COMPILE_OPTIONS --enable-preview -source 23
//RUNTIME_OPTIONS --enable-preview
" "$@" ; exit $? //JAVA 23+ //COMPILE_OPTIONS --enable-preview -source 23 //RUNTIME_OPTIONS --enable-preview void main(String... args) { System.out.println("Hello World"); } " "$@" ; exit $? //JAVA 25 //COMPILE_OPTIONS --enable-preview -source 25 //RUNTIME_OPTIONS --enable-preview import java.util.concurrent.Callable; import java.util.concurrent.StructuredTaskScope; import static java.lang.System.*; void main(String... args) { out.println("Hello Java 25"); Callable task1 = () -> { out.println("Task 1" + Thread.currentThread()); return "Task 1"; }; Callable task2 = () -> { out.println("Task 2" + Thread.currentThread()); return 2; }; try ( var scope = new StructuredTaskScope()) { StructuredTaskScope.Subtask subtask1 = scope.fork(task1); StructuredTaskScope.Subtask subtask2 = scope.fork(task2); scope.join(); } catch (Exception e) { e.printStackTrace(); } }

我們現(xiàn)在可以像使用任何 Java 文件一樣開(kāi)發(fā)腳本。
一旦準(zhǔn)備好發(fā)布,我們可以將其導(dǎo)出為不同的格式,如下所示:

  • 一個(gè)jar文件:jbang導(dǎo)出可移植的helloworld.java。如果您的腳本使用依賴項(xiàng),則更推薦使用以下命令。
  • A fatjar:包含所有依賴項(xiàng):jbang export fatjar helloworld.java。該方法仍然需要在目標(biāo)機(jī)器上安裝JDK/JRE。如果您不想這樣做,更推薦使用接下來(lái)的命令。
  • 包含 JDK 的 jlink 二進(jìn)制文件:jbang export jlink helloworld.java。要運(yùn)行的二進(jìn)制文件是 Unix 上的 helloworld-jlink/bin/helloworld 或 Windows 上的 helloworld-jlink/bin/helloworld.bat。
  • A 原生 imgae:jbang 導(dǎo)出原生 helloworld.java。這需要安裝 GraalVM。

腳本也可以導(dǎo)出為 mavenrepo: jbang export mavenrepo helloworld.java

JDK管理

如前一章所示,JBang 可以在您的計(jì)算機(jī)上安裝 JDK。
您可以使用 jbang jdk list 列出已安裝的 JDK,使用 jbang jdk list --available --show-details 列出可安裝的 JDK,使用 jbang jdk install [version] 安裝新的 JDK。 Jbang 還支持使用 SDKMAN 來(lái)管理受支持系統(tǒng)上的 JDK。

此外,可以在腳本中指定 JDK 版本。
這是通過(guò)將以下行添加到腳本屬性來(lái)完成的: //JAVA [version](如果我們想要精確版本)或 //JAVA [version](如果我們至少想要一個(gè)特定版本)。
在這種情況下,JBang 將自動(dòng)安裝所需的 JDK 版本并僅將其用于該腳本,而不更改系統(tǒng)的默認(rèn) JDK。

例如,以下腳本使用 Java 25 和一些預(yù)覽功能。

> jbang init helloworld.java

沒(méi)有“Main”類的腳本

由于腳本往往是輕量級(jí)的,因此最好在沒(méi)有類和 main 方法的情況下編寫它們。
幸運(yùn)的是,Java 有一個(gè)稱為隱式聲明類和實(shí)例主方法的功能(在 Java 23 中仍處于預(yù)覽狀態(tài))。
此功能允許在沒(méi)有類和靜態(tài) main 方法的情況下編寫 java 程序和 JBang 腳本。

下面的腳本將被編譯并執(zhí)行,沒(méi)有任何問(wèn)題。

> jbang helloworld.java
Hello world

這是通過(guò)向腳本添加以下屬性來(lái)實(shí)現(xiàn)的。

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

第一行 //JAVA 23 告訴 JBang 使用 Java 23 或更高版本。
第二行和第三行 //COMPILE_OPTIONS --enable-preview -source 23 和 //RUNTIME_OPTIONS --enable-preview 分別啟用編譯和運(yùn)行時(shí)的預(yù)覽功能。

一旦功能變得穩(wěn)定,我們可以刪除這 3 行,腳本仍然可以工作。整齊!

依賴關(guān)系

JBang 支持以 Gradle 樣式依賴項(xiàng)的形式向腳本添加依賴項(xiàng),方法是為每個(gè)依賴項(xiàng)添加 //DEPS atrefact-id:atrefact-name:version 行。
例如,要使用 jfiglet 庫(kù),我們可以將以下行添加到腳本中: //DEPS com.github.lalyos:jfiglet:0.0.8.

> jbang init helloworld.java

目錄

JBang 中的目錄允許有效地組織和共享腳本和模板。
此功能對(duì)于想要共享常見(jiàn)任務(wù)或工作流程的腳本集合的團(tuán)隊(duì)或社區(qū)特別有用。
對(duì)于想要分發(fā)入門代碼或在不提供源代碼的情況下顯示練習(xí)結(jié)果的教師來(lái)說(shuō),它也很有用。

目錄是一個(gè)名為 jbang-catalog.json 的 JSON 文件,其中包含兩組項(xiàng)目:別名和模板。
別名允許使用簡(jiǎn)單的命令從目錄運(yùn)行腳本,而模板則提供新腳本的起點(diǎn)。
目錄可以是遠(yuǎn)程的或本地的,并且可以根據(jù)需要添加和使用任意數(shù)量的本地或遠(yuǎn)程存儲(chǔ)庫(kù)。
有趣的是,JBang 在設(shè)置過(guò)程中創(chuàng)建了一個(gè)本地目錄,其中包含一些開(kāi)箱即用的別名和模板。

JBang 按以下順序在這些目錄中查找本地目錄(源 JBang 文檔):

  1. 當(dāng)前目錄,./jbang-catalog.json
  2. 在./.jbang/jbang-catalog.json中
  3. 在父目錄中,../jbang-catalog.json
  4. 在父級(jí)的 .jbang 目錄中,../.jbang/jbang-catalog.json
  5. 并向上遞歸重復(fù)步驟3和4到文件系統(tǒng)的根
  6. 最后一步它將查看 $HOME/.jbang/jbang-catalog.json

JBang 將在許多開(kāi)源存儲(chǔ)庫(kù)(如 GitHub、GitLab、Bitbucket 等)中查找遠(yuǎn)程目錄。
我將在本文中使用 GitHub 作為示例。
要?jiǎng)?chuàng)建遠(yuǎn)程目錄,您需要將 jbang-catalog.json 添加到存儲(chǔ)庫(kù)的根文件夾中。
然后通過(guò) account/repository_name 引用該目錄。
如果您的存儲(chǔ)庫(kù)名為 jbang-catalog,那么您可以通過(guò)帳戶引用它。
因此,例如,如果我的 GitHub 帳戶名為 yostane,并且我有一個(gè)名為 curs-java 的存儲(chǔ)庫(kù),其中包含一個(gè)名為 jbang-catalog.json 的文件的目錄,我可以通過(guò) yostane/cours-java 引用該目錄。此外,如果我在名為 jbang-catalog 的存儲(chǔ)庫(kù)中有一個(gè) jbang-catalog.json,那么我可以通過(guò) yostane/jbang-catalog 或簡(jiǎn)單地 yostane 引用它。

> jbang helloworld.java
Hello world

以下章節(jié)將展示如何使用目錄中的別名和模板。

別名

JBang 中的別名允許從目錄運(yùn)行腳本。
完整語(yǔ)法是 jbang alias@account/repository [args] 和 jbang alias [args] 分別表示遠(yuǎn)程和本地別名。

可以使用以下格式在目錄文件的別名部分定義別名:

> jbang init helloworld.java

這是我在 DevoxxMA 2024 會(huì)議期間使用的目錄。

> jbang helloworld.java
Hello world

您可以使用以下命令運(yùn)行這些別名:

  • jbang palcli@yostane/cours-java 女士
  • jbang palqrest@yostane/cours-java
  • jbang hellojfx@yostane/cours-java

官方JBang GitHub帳戶提供了包含許多別名和模板的目錄。
讓我們運(yùn)行其中的一些:

  • jbang httpd@jbangdev 運(yùn)行本地網(wǎng)絡(luò)服務(wù)器。
  • jbang gavsearch@jbangdev [arg] 在 search.maven.org 上搜索 [arg]。

模板

模板,這是預(yù)定義的腳本,可以用作新腳本的起點(diǎn)。
它們使用以下格式在目錄文件的模板部分中定義:

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

使用模板時(shí),JBang 會(huì)在 file-refs 屬性中創(chuàng)建所有文件的副本。
當(dāng) file-ref 包含 {basename} 時(shí),JBang 會(huì)將其替換為正在創(chuàng)建的腳本的名稱。
當(dāng)文件引用使用 .qute 擴(kuò)展名時(shí),JBang 使用 Qute 模板引擎

以下是一些現(xiàn)成可用的模板的示例:

  • 使用 picocli 的 CLI 腳本:jbang init -t cli hellocli.java
  • Quarkus 單文件 REST API:jbang init -t qrest helloqrest.java

我們還可以使用社區(qū)共享的互聯(lián)網(wǎng)模板。
例如,此命令創(chuàng)建一個(gè) JUnit 單元測(cè)試文件: jbang init -t junit@jbangdev file_to_test.java.
從命令中我們可以找到 jbangdev/jbang-catalog 存儲(chǔ)庫(kù)中定義模板的 jbang-catalog.json。

/// usr/bin/env jbang "<pre class="brush:php;toolbar:false">///usr/bin/env jbang "<pre class="brush:php;toolbar:false">//JAVA 23+
//COMPILE_OPTIONS --enable-preview -source 23
//RUNTIME_OPTIONS --enable-preview
" "$@" ; exit $? //JAVA 23+ //COMPILE_OPTIONS --enable-preview -source 23 //RUNTIME_OPTIONS --enable-preview void main(String... args) { System.out.println("Hello World"); } " "$@" ; exit $? //JAVA 25 //COMPILE_OPTIONS --enable-preview -source 25 //RUNTIME_OPTIONS --enable-preview import java.util.concurrent.Callable; import java.util.concurrent.StructuredTaskScope; import static java.lang.System.*; void main(String... args) { out.println("Hello Java 25"); Callable task1 = () -> { out.println("Task 1" + Thread.currentThread()); return "Task 1"; }; Callable task2 = () -> { out.println("Task 2" + Thread.currentThread()); return 2; }; try ( var scope = new StructuredTaskScope()) { StructuredTaskScope.Subtask subtask1 = scope.fork(task1); StructuredTaskScope.Subtask subtask2 = scope.fork(task2); scope.join(); } catch (Exception e) { e.printStackTrace(); } }

應(yīng)用商店

JBang App Store 是一個(gè) Web 應(yīng)用程序,允許瀏覽索引目錄的別名。
它提供了一種發(fā)現(xiàn)和使用各種工具和實(shí)用程序的便捷方法,無(wú)需復(fù)雜的設(shè)置或安裝過(guò)程。
例如,當(dāng)我們搜索 yostane 時(shí),我們應(yīng)該能夠找到我在不同目錄中定義的不同別名。
下圖顯示了搜索結(jié)果。

JBang, the missing scripting tool of the Java ecosystem

以下是我在App Store瀏覽時(shí)發(fā)現(xiàn)的一些有趣又好笑的腳本:

  • 考賽。以下是運(yùn)行腳本的一些示例:
    • jbangowsay@ricksbrown/cowsay MOO!
    • jbangowsay@ricksbrown/cowsay -f Dragon“我是維爾德拉·暴風(fēng)雨!”
  • 查找類似 grep 的子字符串: jbang grep@a-services "hello" 。
  • 從圖像創(chuàng)建 PDF:images2pdf@a-services。以下命令將從兩個(gè)圖像創(chuàng)建 PDF 文件:
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">  {
    "catalogs": {},
    "aliases": {
      // aliases
    },
    "templates": {
      // templates
    }
  }
" "$@" ; exit $? //DEPS com.github.lalyos:jfiglet:0.0.9 import com.github.lalyos.jfiglet.FigletFont; public class DependenciesDemo { public static void main(String... args) throws Exception { System.out.println(FigletFont.convertOneLine("JBang is amazing")); } }

當(dāng)您發(fā)布目錄時(shí),它很可能會(huì)在 JBang AppStore 下次索引后出現(xiàn)。
這是此處定義的預(yù)定 GitHub 操作。

一些具有著名框架的示例

通過(guò) JBang,我們可以創(chuàng)建使用流行框架和庫(kù)的單文件應(yīng)用程序。
一些示例包括 Quarkus、picolcli 和 JavaFX。
讓我們?cè)谝韵虏糠种刑接懸恍┦纠?/p>

JavaFX(openjfx)

JavaFX 是一個(gè)桌面和 UI 框架。
其官方網(wǎng)站是 openjfx.io,也受到 Gluon 的支持,Gluon 提供了額外的 UI 組件,并為 JavaFX 帶來(lái)了移動(dòng)應(yīng)用程序支持。
JBang 支持此框架,可用于創(chuàng)建單文件 JavaFX 應(yīng)用程序。

以下是使用 JBang 創(chuàng)建的一些 JavaFX 應(yīng)用程序示例:

  • 基本窗口
  • 更漂亮的例子jbang https://gist.github.com/FDelporte/c69a02c57acc892b4c996a9779d4f830
  • 模板 jbang init -t javafx@yostane hellojfx

夸庫(kù)斯

Quarkus 是一個(gè)針對(duì) Kubernetes 和無(wú)服務(wù)器環(huán)境進(jìn)行優(yōu)化的 Java 框架。
它提供快速啟動(dòng)時(shí)間和低內(nèi)存消耗,使其成為云原生應(yīng)用程序的理想選擇。

感謝 JBang,我們可以創(chuàng)建利用該框架強(qiáng)大功能的單文件 Quarkus 應(yīng)用程序。
以下示例顯示了一個(gè)測(cè)試字符串是否為回文的 REST API。它具有 JSON 解析、日志記錄并提供 OpenAPI 和 Swagger 文檔。

> jbang init helloworld.java

我們可能會(huì)注意到腳本中的 //SOURCES PalindromeService.java 行。
它告訴 JBang 在與腳本相同的目錄中查找名為 PalindromeService.java 的文件。
這意味著JBang支持多文件腳本。

您可以使用 jbang palqrest@yostane/cours-java 運(yùn)行服務(wù)器并使用curl http://localhost:8080/palindrome?input=madam 調(diào)用端點(diǎn)。

> jbang helloworld.java
Hello world

其他語(yǔ)言

JBang 支持運(yùn)行 Java、Kotlin、JShell 和 Groovy 代碼。
它甚至可以從 Markdown 文件運(yùn)行 Java 代碼。
以下是如何在不同語(yǔ)言中使用 JBang 的一些示例:

  • Kotlin:您可以使用 jbang init -t hello.kt filename.kt 初始化 Kotlin 腳本。請(qǐng)注意,這與官方 .main.kts Kotlin 腳本不同。事實(shí)上,JBang 創(chuàng)建的 Kotlin 腳本可以受益于目錄和 App Store 功能。以下是使用 JBang 創(chuàng)建的 Kotlin 腳本的示例。
> jbang init helloworld.java
  • 有趣的事實(shí):JBang 的想法來(lái)自針對(duì) Kotlin 生態(tài)系統(tǒng)的 kscript。
  • Kotlin 已經(jīng)具有原生腳本支持(使用 .main.kts 腳本),但似乎缺乏目錄、模板和 App Store 功能。
    • Groovy:使用 jbang init -t hello.groovy filename.groovy 初始化 Groovy 腳本。以下是使用 JBang 創(chuàng)建的 Groovy 腳本的示例。
> jbang helloworld.java
Hello world
  • JShell:JBang 支持帶有 .jsh 或 .jshell 擴(kuò)展名的 JShell 腳本以及使用 jbang -c 'System.out.println("Inline Java ? yay!")' 的內(nèi)聯(lián)腳本。以下是使用 JBang 創(chuàng)建的 JShell 腳本示例。
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }
  • 使用 Java 和 JShell 代碼塊進(jìn)行 Markdown:您可以使用 jbang my_markdown.md 直接從 Markdown 文件運(yùn)行 Java 和 JShell 代碼塊。
/// usr/bin/env jbang "<pre class="brush:php;toolbar:false">///usr/bin/env jbang "<pre class="brush:php;toolbar:false">//JAVA 23+
//COMPILE_OPTIONS --enable-preview -source 23
//RUNTIME_OPTIONS --enable-preview
" "$@" ; exit $? //JAVA 23+ //COMPILE_OPTIONS --enable-preview -source 23 //RUNTIME_OPTIONS --enable-preview void main(String... args) { System.out.println("Hello World"); } " "$@" ; exit $? //JAVA 25 //COMPILE_OPTIONS --enable-preview -source 25 //RUNTIME_OPTIONS --enable-preview import java.util.concurrent.Callable; import java.util.concurrent.StructuredTaskScope; import static java.lang.System.*; void main(String... args) { out.println("Hello Java 25"); Callable task1 = () -> { out.println("Task 1" + Thread.currentThread()); return "Task 1"; }; Callable task2 = () -> { out.println("Task 2" + Thread.currentThread()); return 2; }; try ( var scope = new StructuredTaskScope()) { StructuredTaskScope.Subtask subtask1 = scope.fork(task1); StructuredTaskScope.Subtask subtask2 = scope.fork(task2); scope.join(); } catch (Exception e) { e.printStackTrace(); } }

以上是JBang,Java 生態(tài)系統(tǒng)中缺失的腳本工具的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

hashmap和hashtable之間的區(qū)別? hashmap和hashtable之間的區(qū)別? Jun 24, 2025 pm 09:41 PM

HashMap與Hashtable的區(qū)別主要體現(xiàn)在線程安全、null值支持及性能方面。1.線程安全方面,Hashtable是線程安全的,其方法大多為同步方法,而HashMap不做同步處理,非線程安全;2.null值支持上,HashMap允許一個(gè)null鍵和多個(gè)null值,Hashtable則不允許null鍵或值,否則拋出NullPointerException;3.性能方面,HashMap因無(wú)同步機(jī)制效率更高,Hashtable因每次操作加鎖性能較低,推薦使用ConcurrentHashMap替

為什么我們需要包裝紙課? 為什么我們需要包裝紙課? Jun 28, 2025 am 01:01 AM

Java使用包裝類是因?yàn)榛緮?shù)據(jù)類型無(wú)法直接參與面向?qū)ο蟛僮?,而?shí)際需求中常需對(duì)象形式;1.集合類只能存儲(chǔ)對(duì)象,如List利用自動(dòng)裝箱存儲(chǔ)數(shù)值;2.泛型不支持基本類型,必須使用包裝類作為類型參數(shù);3.包裝類可表示null值,用于區(qū)分未設(shè)置或缺失的數(shù)據(jù);4.包裝類提供字符串轉(zhuǎn)換等實(shí)用方法,便于數(shù)據(jù)解析與處理,因此在需要這些特性的場(chǎng)景下,包裝類不可或缺。

什么是接口中的靜態(tài)方法? 什么是接口中的靜態(tài)方法? Jun 24, 2025 pm 10:57 PM

StaticmethodsininterfaceswereintroducedinJava8toallowutilityfunctionswithintheinterfaceitself.BeforeJava8,suchfunctionsrequiredseparatehelperclasses,leadingtodisorganizedcode.Now,staticmethodsprovidethreekeybenefits:1)theyenableutilitymethodsdirectly

JIT編譯器如何優(yōu)化代碼? JIT編譯器如何優(yōu)化代碼? Jun 24, 2025 pm 10:45 PM

JIT編譯器通過(guò)方法內(nèi)聯(lián)、熱點(diǎn)檢測(cè)與編譯、類型推測(cè)與去虛擬化、冗余操作消除四種方式優(yōu)化代碼。1.方法內(nèi)聯(lián)減少調(diào)用開(kāi)銷,將頻繁調(diào)用的小方法直接插入調(diào)用處;2.熱點(diǎn)檢測(cè)識(shí)別高頻執(zhí)行代碼并集中優(yōu)化,節(jié)省資源;3.類型推測(cè)收集運(yùn)行時(shí)類型信息實(shí)現(xiàn)去虛擬化調(diào)用,提升效率;4.冗余操作消除根據(jù)運(yùn)行數(shù)據(jù)刪除無(wú)用計(jì)算和檢查,增強(qiáng)性能。

什么是實(shí)例初始器塊? 什么是實(shí)例初始器塊? Jun 25, 2025 pm 12:21 PM

實(shí)例初始化塊在Java中用于在創(chuàng)建對(duì)象時(shí)運(yùn)行初始化邏輯,其執(zhí)行先于構(gòu)造函數(shù)。它適用于多個(gè)構(gòu)造函數(shù)共享初始化代碼、復(fù)雜字段初始化或匿名類初始化場(chǎng)景,與靜態(tài)初始化塊不同的是它每次實(shí)例化時(shí)都會(huì)執(zhí)行,而靜態(tài)初始化塊僅在類加載時(shí)運(yùn)行一次。

變量的最終關(guān)鍵字是什么? 變量的最終關(guān)鍵字是什么? Jun 24, 2025 pm 07:29 PM

InJava,thefinalkeywordpreventsavariable’svaluefrombeingchangedafterassignment,butitsbehaviordiffersforprimitivesandobjectreferences.Forprimitivevariables,finalmakesthevalueconstant,asinfinalintMAX_SPEED=100;wherereassignmentcausesanerror.Forobjectref

什么是工廠模式? 什么是工廠模式? Jun 24, 2025 pm 11:29 PM

工廠模式用于封裝對(duì)象創(chuàng)建邏輯,使代碼更靈活、易維護(hù)、松耦合。其核心答案是:通過(guò)集中管理對(duì)象創(chuàng)建邏輯,隱藏實(shí)現(xiàn)細(xì)節(jié),支持多種相關(guān)對(duì)象的創(chuàng)建。具體描述如下:工廠模式將對(duì)象創(chuàng)建交給專門的工廠類或方法處理,避免直接使用newClass();適用于多類型相關(guān)對(duì)象創(chuàng)建、創(chuàng)建邏輯可能變化、需隱藏實(shí)現(xiàn)細(xì)節(jié)的場(chǎng)景;例如支付處理器中通過(guò)工廠統(tǒng)一創(chuàng)建Stripe、PayPal等實(shí)例;其實(shí)現(xiàn)包括工廠類根據(jù)輸入?yún)?shù)決定返回的對(duì)象,所有對(duì)象實(shí)現(xiàn)共同接口;常見(jiàn)變體有簡(jiǎn)單工廠、工廠方法和抽象工廠,分別適用于不同復(fù)雜度的需求。

什么是類型鑄造? 什么是類型鑄造? Jun 24, 2025 pm 11:09 PM

類型轉(zhuǎn)換有兩種:隱式和顯式。1.隱式轉(zhuǎn)換自動(dòng)發(fā)生,如將int轉(zhuǎn)為double;2.顯式轉(zhuǎn)換需手動(dòng)操作,如使用(int)myDouble。需要類型轉(zhuǎn)換的情況包括處理用戶輸入、數(shù)學(xué)運(yùn)算或函數(shù)間傳遞不同類型的值時(shí)。需要注意的問(wèn)題有:浮點(diǎn)數(shù)轉(zhuǎn)整數(shù)會(huì)截?cái)嘈?shù)部分、大類型轉(zhuǎn)小類型可能導(dǎo)致數(shù)據(jù)丟失、某些語(yǔ)言不允許直接轉(zhuǎn)換特定類型。正確理解語(yǔ)言的轉(zhuǎn)換規(guī)則有助于避免錯(cuò)誤。

See all articles