一条Java记录可以保存多少个字段?

Bas*_*que 3 java record max limit java-record

Java记录中定义的属性的最大数量(技术上是 \xe2\x80\x9crecord_components\xe2\x80\x9d)是多少?

\n

我阅读了规范JEP 395:记录。没有提到限制。

\n

Bas*_*que 6

第254章

经过反复试验发现 254 是极限。

使用 255 个字段会导致错误(参数过多):

  • IntelliJ 2023.2 与Java 21
  • 来自 JDK 20.0.2 的javac

示例代码:

package work.basil.example.codegen;

public record MaxRec (
        String x001 ,
        String x002 ,
        String x003 ,
        String x004 ,
        String x005 ,
        String x006 ,
        String x007 ,
        String x008 ,
        String x009 ,
        String x010 ,
        String x011 ,
        String x012 ,
        String x013 ,
        String x014 ,
        String x015 ,
        String x016 ,
        String x017 ,
        String x018 ,
        String x019 ,
        String x020 ,
        String x021 ,
        String x022 ,
        String x023 ,
        String x024 ,
        String x025 ,
        String x026 ,
        String x027 ,
        String x028 ,
        String x029 ,
        String x030 ,
        String x031 ,
        String x032 ,
        String x033 ,
        String x034 ,
        String x035 ,
        String x036 ,
        String x037 ,
        String x038 ,
        String x039 ,
        String x040 ,
        String x041 ,
        String x042 ,
        String x043 ,
        String x044 ,
        String x045 ,
        String x046 ,
        String x047 ,
        String x048 ,
        String x049 ,
        String x050 ,
        String x051 ,
        String x052 ,
        String x053 ,
        String x054 ,
        String x055 ,
        String x056 ,
        String x057 ,
        String x058 ,
        String x059 ,
        String x060 ,
        String x061 ,
        String x062 ,
        String x063 ,
        String x064 ,
        String x065 ,
        String x066 ,
        String x067 ,
        String x068 ,
        String x069 ,
        String x070 ,
        String x071 ,
        String x072 ,
        String x073 ,
        String x074 ,
        String x075 ,
        String x076 ,
        String x077 ,
        String x078 ,
        String x079 ,
        String x080 ,
        String x081 ,
        String x082 ,
        String x083 ,
        String x084 ,
        String x085 ,
        String x086 ,
        String x087 ,
        String x088 ,
        String x089 ,
        String x090 ,
        String x091 ,
        String x092 ,
        String x093 ,
        String x094 ,
        String x095 ,
        String x096 ,
        String x097 ,
        String x098 ,
        String x099 ,
        String x100 ,
        String x101 ,
        String x102 ,
        String x103 ,
        String x104 ,
        String x105 ,
        String x106 ,
        String x107 ,
        String x108 ,
        String x109 ,
        String x110 ,
        String x111 ,
        String x112 ,
        String x113 ,
        String x114 ,
        String x115 ,
        String x116 ,
        String x117 ,
        String x118 ,
        String x119 ,
        String x120 ,
        String x121 ,
        String x122 ,
        String x123 ,
        String x124 ,
        String x125 ,
        String x126 ,
        String x127 ,
        String x128 ,
        String x129 ,
        String x130 ,
        String x131 ,
        String x132 ,
        String x133 ,
        String x134 ,
        String x135 ,
        String x136 ,
        String x137 ,
        String x138 ,
        String x139 ,
        String x140 ,
        String x141 ,
        String x142 ,
        String x143 ,
        String x144 ,
        String x145 ,
        String x146 ,
        String x147 ,
        String x148 ,
        String x149 ,
        String x150 ,
        String x151 ,
        String x152 ,
        String x153 ,
        String x154 ,
        String x155 ,
        String x156 ,
        String x157 ,
        String x158 ,
        String x159 ,
        String x160 ,
        String x161 ,
        String x162 ,
        String x163 ,
        String x164 ,
        String x165 ,
        String x166 ,
        String x167 ,
        String x168 ,
        String x169 ,
        String x170 ,
        String x171 ,
        String x172 ,
        String x173 ,
        String x174 ,
        String x175 ,
        String x176 ,
        String x177 ,
        String x178 ,
        String x179 ,
        String x180 ,
        String x181 ,
        String x182 ,
        String x183 ,
        String x184 ,
        String x185 ,
        String x186 ,
        String x187 ,
        String x188 ,
        String x189 ,
        String x190 ,
        String x191 ,
        String x192 ,
        String x193 ,
        String x194 ,
        String x195 ,
        String x196 ,
        String x197 ,
        String x198 ,
        String x199 ,
        String x200 ,
        String x201 ,
        String x202 ,
        String x203 ,
        String x204 ,
        String x205 ,
        String x206 ,
        String x207 ,
        String x208 ,
        String x209 ,
        String x210 ,
        String x211 ,
        String x212 ,
        String x213 ,
        String x214 ,
        String x215 ,
        String x216 ,
        String x217 ,
        String x218 ,
        String x219 ,
        String x220 ,
        String x221 ,
        String x222 ,
        String x223 ,
        String x224 ,
        String x225 ,
        String x226 ,
        String x227 ,
        String x228 ,
        String x229 ,
        String x230 ,
        String x231 ,
        String x232 ,
        String x233 ,
        String x234 ,
        String x235 ,
        String x236 ,
        String x237 ,
        String x238 ,
        String x239 ,
        String x240 ,
        String x241 ,
        String x242 ,
        String x243 ,
        String x244 ,
        String x245 ,
        String x246 ,
        String x247 ,
        String x248 ,
        String x249 ,
        String x250 ,
        String x251 ,
        String x252 ,
        String x253 ,
        String x254
        // , String x255  // Error: too many parameters
) {}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,为了好玩,这里是用于生成上述代码的代码。

此代码生成 Java 源代码。该源代码出现在您的控制台上。将该源代码复制/粘贴到文本文件中。命名该文件MaxRec.java。编译该文件。看到错误出现。

package work.basil.example.codegen;

import java.util.List;
import java.util.stream.IntStream;

public class MaxArgsInRecord
{
    public static void main ( String[] args )
    {
        System.out.println ( "public record MaxRec (" );
        int countProperties = 255;
        List < String > fields =
                IntStream
                        .rangeClosed ( 1 , countProperties )
                        .mapToObj (
                                ( int i ) -> "   String x" + String.format ( "%03d" , i )
                        )
                        .toList ( );
        System.out.println ( String.join ( " ,\n" , fields ) );
        System.out.println ( ") {}" );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Slevin它不会生成列表,它会将内容打印到“System.out”。具体来说,它打印的是java源代码。将其复制/粘贴到文本文件中,然后编译。上面的代码有效。将上面的代码设置为“countProperties = 256”,或任何高于该值的值,并且 __this__ 代码可以正常工作,但它发出的 java 源代码不再被接受。 (2认同)
  • 虽然参数的数量没有限制,但参数的限制是 255 个。“this”可能算作第 255 个。在这种情况下,达到参数限制。 (2认同)
  • @rzwitserloot 我看到“属性”数量的字段为 2 个字节。我没有看到参数字段。 (2认同)
  • @rzwitserloot 正如 Garr Godfrey 所说,该数字是属性计数,与参数完全无关。然而,类文件中的某些地方的表示效率非常低。为了保留方法参数,签名是在每次出现时重复每个类名称的单个字符串,而不是与常量池共享它。虽然具有完全相同的参数列表的方法共享签名字符串,但采用 200 个字符串的方法与采用 201 个字符串的方法具有不同的签名。这使得 `Ljava/lang/String;` 重复了 401 次…… (2认同)

Gar*_*rey 5

255 - 1 = 254

由于方法描述符长度的限制,一个方法可以定义的最大参数数量为 255 个。包括this,由于记录构造函数是非静态的,因此还剩 254 个。

请参阅Java 虚拟机规范4.3.3方法描述符

我相信一条记录必须至少有一个将所有属性作为单独参数的构造函数,因此这将有效地限制记录组件的数量。

  • 很高兴从规范中得到解释。 (2认同)