[英]JShell - How to add method to existing class without replacing this class?
tl; dr :如何在不替換此類的情況下將方法添加到現有類?
說明 :
當我在JShell中運行以下命令時:
public class TestClass {}
以下輸出打印:
created class TestClass
再次運行此命令會提供以下輸出:
modified class TestClass
讓我們用一種方法創建類,如下所示:
public class TestClass {
public static void testMethod1() {
System.out.println("In testMethod1");
}
}
值得一提的是,輸出與以前的類覆蓋略有不同:
replaced class TestClass
運行testMethod1
成功結束,並In testMethod1
中打印In testMethod1
。
現在我想TestClass
不丟失testMethod1
情況下向現有的TestClass
添加新方法。 所以我運行以下代碼片段:
public class TestClass {
public static void testMethod2() {
System.out.println("In testMethod2");
}
}
...並且testMethod1
丟失了,因為整個TestClass
已被替換。
如何在不覆蓋現有類的情況下向現有類添加新方法? 如果我寫了10個方法怎么辦? 我是否應該寫下我想要添加到類的新方法旁邊的現有方法? 不應該JShell提示用戶關於以警告形式替換類嗎?
任何提示或幫助表示贊賞。
JShell無法做到這一點,我認為這不是大多數人想要的。 如果要定期合並到現有代碼中,您可能希望使用保持源代碼完整的編輯器並從頭開始編譯源代碼。 除了編譯的字節代碼之外,JShell還需要跟蹤所有類型的源代碼信息,以滿足您的需求。 例如,如果添加了一個已經作為定義泛型方法的結果實現為橋接方法的方法,會發生什么?
消息因替換或修改而不同的原因是因為JShells使用HotSwap,只能在類不改變其形狀時應用,即聲明具有相同簽名的相同方法和字段。
如何在不覆蓋現有類的情況下向現有類添加新方法?
你可以使用
/edit
這將打開一個Jshell編輯板,您可以在其中添加新方法,並接受以更新您的案例中的類定義。 jshell命令還說明了使用其name
或id
編輯多個片段的其他幾個屬性。 添加截圖以了解如何執行此操作:
如果我寫了10個方法怎么辦? 我是否應該寫下我想要添加到類的新方法旁邊的現有方法?
這樣一個用例似乎更多地關注IDE而不是基於REPL的jshell,並且在JEP#222 jshell上明確提到了非目標:Java Shell(讀取 - 評估 - 打印循環)
超出范圍的是圖形界面和調試器支持。 JShell API旨在允許IDE和其他工具中的JShell功能,但jshell工具並非旨在成為IDE。
不應該JShell提示用戶關於以警告形式替換類嗎?
第二個@Elliot會在評論中提到, 顯然現在還沒有 。 雖然這聽起來很有趣,但要求恕我直言,但必須同樣權衡實施它的想法,同時不要降低工具的性能。 @Rafael的答案提供了保持這種開銷的提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.