What is the maximum number of properties (“record components”, technically) defined in a Java record?
I read the specification, JEP 395: Records. No mention of a limit.
What is the maximum number of properties (“record components”, technically) defined in a Java record?
I read the specification, JEP 395: Records. No mention of a limit.
On
Some trial-and-error found 254 to be the limit.
Using 255 fields results in an error (too many parameters) in:
Example code:
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
) {}
By the way, for fun, here is the code used to generate the above code.
This code generates Java source code. That source code appears on your console. Copy/paste that source code into a text file. Name that file MaxRec.java. Compile that file. See error appear.
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 ( ") {}" );
}
}
255 - 1 = 254
Due to the limit on method descriptor length, the maximum number of parameters a method can define is 255. Including the
this, since a record constructor is non-static, that leaves 254.See Java Virtual Machine Specification, 4.3.3. Method Descriptors
I believe a record must have at least one constructor that takes all properties as individual parameters, so this would effectively limit the number of record components.