<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個 Java 方法,最多能定義多少參數(shù)?

          共 1011字,需瀏覽 3分鐘

           ·

          2020-07-07 11:17


          版權(quán)申明:本文經(jīng)機器之心(微信公眾號:almosthuman2014)授權(quán)轉(zhuǎn)載,禁止二次轉(zhuǎn)載?

          原文鏈接:http://justinblank.com/experiments/howmanytypeparameterscanajavamethodhave.html

          機器之心編譯,參與:李志偉、張倩


          在?JVM?中,一個 Java 方法,最多能定義多少參數(shù)呢?這是一個很無聊的問題,即使能定義一萬個,十萬個,誰又會真的去這么做呢。

          但是作為一個 coder,最重要的不就是好奇心嗎,沒有好奇心,和一條咸魚又有什么區(qū)別呢?本文作者就是這樣一位充滿好奇心的 coder。

          c2e7d7528f03ae49e5a90fc4d9ebd6d5.webp

          我最近給我的 QuickTheories 分支添加了一個接口:

          @FunctionalInterface
          public interface QuadFunction {
          E apply(A a, B b, C c, D d);
          }

          讓我好奇的是這個方法能有多少個類型參數(shù)。到目前為止,我敢說,Java 語言規(guī)范并沒有談及這個問題。

          對于實現(xiàn)定義的限制可能是什么,我有兩個猜測:

          1. 編譯器會設(shè)置一個可預(yù)測的限制,如 255 或 65535。

          2. 編譯器的緊急行為會由于實現(xiàn)細節(jié)(堆棧溢出或同樣不可預(yù)測/不相關(guān)的東西)而設(shè)置意外的限制。

          我不想在源代碼上測試我那點可憐的 C++技巧,所以我決定只測試編譯器做了什么。我寫了一個 Python 腳本,它使用二進制搜索找到最少的致錯類型參數(shù)。完整的腳本放在 Github repo (https://github.com/hyperpape/java-max-type-params) 中。

          腳本地址:https://github.com/hyperpape/java-max-type-params

          生成方法很簡單。幸運的是,我們不必使用任何類型參數(shù),只需以的形式發(fā)出它們:

          def write_type_plain(count):
          with open('Test.java', 'w') as f:
          f.write("public class Test {\n")
          f.write("public <")
          for i in range(count):
          if (i > 0):
          f.write(", ")
          f.write("A" + str(i + 1))
          f.write("> void testMethod() {}")
          f.write("}")

          運行二進制搜索可以得到以下輸出:

          >>> error: UTF8 representation for string ">>> largest type: 2776

          這個錯誤有點模糊,但事后看來是可以預(yù)見的。編譯器生成的類文件包含許多字符串,包括類中每個方法的方法簽名。這些字符串存儲在常量池中,常量池中的條目最大為 65535 字節(jié),這是由?JVM?規(guī)范規(guī)定的限制。

          所以,我之前的猜測都不完全正確。類型參數(shù)的最大數(shù)目是一個突現(xiàn)特征(emergent property),而不是一個明確的決定。不過,并不是編譯器本身的實現(xiàn)導(dǎo)致了錯誤。

          相反,JVM?的類文件格式限制了可以在類文件中表示的類型參數(shù)的數(shù)量。這是真的,盡管?JVM對泛型一無所知。這也意味著類型參數(shù)的最大數(shù)目完全取決于如何編寫方法。

          我嘗試了一種新的編碼類型參數(shù)的方法(先前鏈接文件中的 write_Type_Compact),使用完整的合法 ASCII 字符(A-Z、a-z、$和_)。該實現(xiàn)有點過于復(fù)雜,因為可以使用字符 0~9,但不能是標識符的初始字符,因為 Java 關(guān)鍵字不能作為類型參數(shù)出現(xiàn)。我只是用等長的 UTF-8 字符替換了短單詞「if」和「do」。更緊湊的編碼將參數(shù)數(shù)量從 2776 增加到 3123。

          不方便的是,_A 是一種合法的?Java?標識符,但 _ 不是。謝天謝地,我的編碼在不使用初始_情況下就生成了 3392 個 2 字節(jié)類型參數(shù),因此我覺得沒有必要進行簿記以發(fā)出初始字符_。

          再來一個小技巧

          解壓類文件顯示,65536 個字符的大部分不是我生成的類型參數(shù),而是子字符串 Ljava/lang/object 的重復(fù)實例。因為沒有提供關(guān)于類型參數(shù)的信息,所以類文件顯示它們擴展了對象,并在方法簽名中對其進行編碼。我修改了生成器來解決這個問題。

          循環(huán)的關(guān)鍵部分是:

          s = type_var(i)
          f.write(s)
          if (s != 'A'):
          f.write(" extends A")

          在類型參數(shù)中,除了一個實例 java/Lang/Object 之外的所有實例都被替換為 A。在進行了這個更改之后,編譯了一個具有 9851 個類型參數(shù)的方法。

          由于參數(shù)的數(shù)量增加了很多,所以我使用的代碼肯定需要調(diào)整。使用非 ASCII Unicode 標識符可能是完全高效的必要條件,但簡單地指出這是可以做到的我就很滿意了。

          這些都不重要

          很難想象有人會達到這個極限。代碼生成有時會達到語言或編譯器的限制,但即使生成的代碼似乎也不太可能使用成百上千的類型參數(shù)。

          盡管如此,如果我是規(guī)則制定者,我會考慮明確禁止任何類或方法具有 255 個以上的類型參數(shù)。明確的限制似乎更好,即使它只影響百萬分之一的程序。

          推薦前后端分離后臺管理系統(tǒng)實戰(zhàn)


          登陸界面

          8d1d5ce060ea0ef874937cef291118b4.webp

          首頁

          ca3584d5a57dc6bfc397218773fb523a.webp

          富文本編輯器

          a008b4693521ece5d4e3f3d81178aae1.webp

          md編輯器

          1d6cb082bbf34515565433a7200cb1c2.webp

          圖表

          97e071299feaf809517f9a1693b0a1a2.webp

          表格

          2a114d4cb06aeea245f541db2a5fecdf.webp

          上述系統(tǒng)方案作為一套多功能的后臺框架模板,適用于絕大部分的后臺管理系統(tǒng)(Web Management System)開發(fā)。基于 vue.js,使用 vue-cli3 腳手架,引用 Element UI 組件庫,方便開發(fā)快速簡潔好看的組件。分離顏色樣式,支持手動切換主題色,而且很方便使用自定義主題色。


          這套前端系統(tǒng)是相當干凈的,也非常簡單,大家后臺可以用自己較為熟悉的后端就可以直接對接,寫出自己任意的后臺管理系統(tǒng)了。


          獲取方式:

          開源項目地址+vue學習視頻掃下面二維碼直接回復(fù):v01



          瀏覽 162
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产乱码一区二区三区 | 五月丁香小说色原网站 | 九月色婷婷| 男人天堂新网址 | 熟女大黑逼 |