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.
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 ( ") {}" );
}
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With