рднрд╛рдЧ рдПрдХ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ | рднрд╛рдЧ рджреЛ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ
рд╣рдо рдЧрдгрдирд╛ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВредрдЗрд╕ рдмрд╛рд░ рд╣рдо рдореБрджреНрджреЗ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрдХреНрд╖ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдИрдбреАрдИ, рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдЬреЗрд╡реАрдПрдо рд╣рдорд╛рд░реА рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдХреИрд╕реЗ рджреЗрдВрдЧреЗредрд╕рд╛рдордЧреНрд░реА
тАГтАГ
тАГтАГ
Javac рдЯреВрд▓реНрд╕тАГтАГ
рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рд╡рд┐рдзрд┐тАГтАГ
рдбрд╛рдпрдирд╛рдорд┐рдХ рдХреНрд▓рд╛рд╕-рдлрд╛рдЗрд▓ рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓тАГтАГтАГтАГ
рдЕрдЪрд╛рдирдХ рдХрдард┐рдирд╛рдЗрдпрд╛рдБтАГтАГтАГтАГ
рдЙрдЬреНрдЬреНрд╡рд▓ рднрд╡рд┐рд╖реНрдптАГтАГ
рдЕрд╕реБрд░рдХреНрд╖рд┐рддтАГтАГ
рдЯреЗрд╕реНрдЯтАГтАГтАГтАГ
Javac рдФрд░ рд╕реНрд╡рд┐рдЪ рдкреНрд░рджрд░реНрд╢рди рдХрд╛тАГтАГ
рдирд┐рд╖реНрдХрд░реНрд╖тАГтАГ
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрдирдЙрдкрдХрд░рдг
рдЬрд╛рд╡рд╛рдХ рд╣рдорд╛рд░реА рджреЗрдЦрднрд╛рд▓ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдЙрди рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ java.lang.Enum
, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИредрд╣рдо asVtools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд░рд┐рдХрд▓реНрдкрдирд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ - JVM рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдФрд░ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ , рдФрд░ ASM рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдФрджреНрдпреЛрдЧрд┐рдХ рдкреИрдорд╛рдиреЗ рдкрд░ рд╡рд░реНрдЧ-рдлрд╛рдЗрд▓реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ редрд╕рдордЭрдиреЗ рдХреА рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдХреБрдЫ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рд╕рд╛рд░ рдПрдХ рдЬрд╛рд╡рд╛-рдЬреИрд╕реЗ рдЫрджреНрдордХреЛрдб рдореЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛редjavac
рдПрдХ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдмрд┐рдирд╛ рдЪрд╛рд▓ рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп, рдХреЗрд╡рд▓ рдПрдХ рдХреА рдорджрдж рд╕реЗ javac
ред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╣рдо рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ javac рдЗрд╕реЗ "рдХреЛрдб рдмрд╣реБрдд рдмрдбрд╝рд╛" рд╢рд╛рдк рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ редрдХрд╛рдлреА рд╕рдордп рд╕реЗ, рдЬрд╛рд╡рд╛ 1.7 рдХреЗ рдмрд╛рдж рд╕реЗ, рдпрд╣ рд╕рдВрдЦреНрдпрд╛ 2_746 рддрддреНрд╡реЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рд░рдЦреА рдЧрдИ рд╣реИред рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛ 11 рдХреЗ рдмрд╛рдж, рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдП рдФрд░ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдШрдЯрдХрд░ 2_743 рд╣реЛ рдЧрдИред рд╣рд╛рдВ, рд╣рд╛рдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреВрд▓ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдХрд╛рд░рдг!рд╣рдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗредрдирд┐рдХрд╛рд▓рдиреЗ рдХреА рд╡рд┐рдзрд┐
рдЪреВрдВрдХрд┐ рд╕реАрдорд┐рдд рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдмреНрд▓реЙрдХ рдореЗрдВ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд╛рдж рдХреЛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗредрдпрд╛рдж рдХрд░реЗрдВ рдХрд┐ рдпрд╣ FizzBuzz
рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рдЧрдгрдирд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ ред рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВредрд╕реНрдерд┐рд░ {}static {
Fizz = new FizzBuzz("Fizz", 0);
Buzz = new FizzBuzz("Buzz", 1);
FizzBuzz = new FizzBuzz("FizzBuzz", 2);
$VALUES = new FizzBuzz[] {
Fizz,
Buzz,
FizzBuzz
};
}
рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдорди рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╣реИ рд╕реГрдЬрди рдФрд░ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП $VALUES
рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВред$VALUES = createValues();
рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЙрд╕реА рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:static {
FizzBuzz[] localValues = createValues();
int index = 0;
Fizz = localValues[index++];
Buzz = localValues[index++];
FizzBuzz = localValues[index++];
$VALUES = localValues;
}
private static FizzBuzz[] createValues() {
return new FizzBuzz[] {
new FizzBuzz("Fizz", 0),
new FizzBuzz("Buzz", 1),
new FizzBuzz("FizzBuzz", 2)
};
}
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд░рдгреА рддрддреНрд╡ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреИрдкреНрдЪрд░ рдФрд░ рдмрд╛рдж рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╡реГрджреНрдзрд┐ 6 рдмрд╛рдЗрдЯреНрд╕ рдХреА рд▓рд╛рдЧрдд рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рдбрд╛рд▓реЗрдВред
private static int valueIndex;
static {
$VALUES = createValues();
valueIndex = 0;
Fizz = nextValue();
Buzz = nextValue();
FizzBuzz = nextValue();
}
private static FizzBuzz nextValue() {
return $VALUES[valueIndex++];
}
рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 11 рдмрд╛рдЗрдЯреНрд╕ рд▓рдЧрддреЗ рд╣реИрдВ $VALUES
, valueIndex
рдФрд░ рд╕реНрдереИрддрд┐рдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ , рдФрд░ 65_524 рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рдЦреЗрддреЛрдВ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ 6 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╣рдореЗрдВ 10_920 рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИредJavac рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ рдЪрд╛рд░ рдЧреБрдирд╛ рд╡рд┐рдХрд╛рд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдкреАрдврд╝реА рджреНрд╡рд╛рд░рд╛ рдордирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП!рдЬреЗрдирд░реЗрдЯрд░ рд╕реНрд░реЛрдд рдХреЛрдб: ExtractMethodHugeEnumGenerator.java рдЙрддреНрдкрдиреНрдирд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг: ExtractMethodHugeEnum.classрдбрд╛рдпрдиреЗрдорд┐рдХ рдХреНрд▓рд╛рд╕-рдлрд╛рдЗрд▓ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ
рдпрд╣ рдЬреЗрдИрдкреА 309 рдФрд░ рдЗрд╕рдХреЗ рд░рд╣рд╕реНрдпрдордп рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ редрд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░ рдХрд╛ рд╕рд╛рд░:рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдПрдХ рдкреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рдФрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ CONSTANT_Dynamic
ред рдПрдХ рдХрдХреНрд╖рд╛ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реНрдерд┐рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЬреНрдЮрд╛рдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдХрд┐рд╕реА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдкрд╣рд▓рд╛ рд▓реЛрдбрд┐рдВрдЧ рдЗрд╕рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИредрдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдмрди рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрд╛рдп рдирд╣реАрдВ рд╣реИрдВред рдЬреЛ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд╣реИредрдЕрдЧрд░ рдЖрдк рднреА рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рддреБрд░рдВрдд рднреВрд▓ рдЬрд╛рдЗрдПред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЕрд▓рдЧ рд╕реЗ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдирд┐рд░рдВрддрд░ рдХреЗ рд▓рд┐рдП рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рдХреЙрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреЗрд╡реАрдПрдо рдПрдХ рд╕рд┐рдХреНрдХрд╛ рдлреЗрдВрдХ рджреЗрдЧрд╛ рдФрд░ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛, рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдмрд▓рд┐рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ CONSTANT_Dynamic рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдирдХреЛрдВ рдкрд░ рдЕрдкрдиреЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рд╕реНрдерд╛рдиреАрдп рд▓реБрдХрдЕрдк рдСрдмреНрдЬреЗрдХреНрдЯ,
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░рдВрддрд░ рдХреЗ рдирд╛рдо рдШрдЯрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ,
- рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд░реНрдЧ, рдФрд░
- рдХрд┐рд╕реА рднреА рд╢реЗрд╖ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рддрд░реНрдХред
As with invokedynamic, multiple threads can race to resolve, but a unique winner will be chosen and any other contending answers discarded.
рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреВрд▓ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ldc
, ldc_w
рдФрд░ ldc2_w
ред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рд╣реИ - ldc
редрдпрд╣, рджреВрд╕рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдХреЗ рдкрд╣рд▓реЗ 255 рд╕реНрд▓реЙрдЯреНрд╕ рд╕реЗ рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ 1 рдмрд╛рдЗрдЯ рдХрдо рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рд╣рдореЗрдВ 255 рдмрд╛рдЗрдЯ рддрдХ рдХреА рдмрдЪрдд рдФрд░ 255 + ((65_524 - (255 * 5)) / 6) = 10_963
рдЧрдгрдирд╛ рдореЗрдВ рдПрдХ рддрддреНрд╡ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░ рд╡реГрджреНрдзрд┐ рдЗрддрдиреА рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╣реИредрдЗрд╕ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде, рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУредрд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдмреНрд▓реЙрдХ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдмрдЬрд╛рдп, nextValue()
рд╣рдо рдЕрдм рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдореВрд▓реНрдп рдХреЛ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗред ordinal
рдЧрдгрдирд╛ рддрддреНрд╡ рдХреЗ рдХреНрд░рдорд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ valueIndex
, рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд┐рдзрд┐ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛nextValue()
рдФрд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдзрд╛рдЧрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╣редрдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо MethodHandle рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ new
рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИ ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рдзрд┐ рд╕рдВрднрд╛рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп MethodHandles.Lookup :: findConstructor () рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, JVM рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рд╕рдВрднрд╛рд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛редрдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирдХреЛрдВ рдХреЛ рдирд╛рдорд╛рдВрдХрд┐рдд рддрддреНрд╡ рдФрд░ рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛:private FizzBuzz(MethodHandles.Lookup lookup, String name, Class<?> enumClass, int ordinal) {
super(name, ordinal);
}
рдЫрджреНрдо рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрд░рдВрднреАрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:static {
Fizz = JVM_ldc(FizzBuzz::new, "Fizz", 0);
Buzz = JVM_ldc(FizzBuzz::new, "Buzz", 1);
FizzBuzz = JVM_ldc(FizzBuzz::new, "FizzBuzz", 2);
$VALUES = createValues();
}
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢реЛрдВ ldc
рдХреЛ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ JVM_ldc()
рдЧрдпрд╛ рд╣реИ, рдЙрдирдХреЗ рд╕реНрдерд╛рди рдкрд░ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЬреЗрд╡реАрдПрдо рдирд┐рд░реНрджреЗрд╢ рд╣реЛрдВрдЧреЗредрдЪреВрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд░рдгреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рднрд░рдиреЗ рдХреЛ $VALUES
рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдирд┐рд░рдВрддрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:private static FizzBuzz[] createValues(MethodHandles.Lookup lookup, String name, Class<?> clazz, FizzBuzz... elements) {
return elements;
}
рдЗрд╕ рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдЪрд╛рд▓, рд╡рд╣рд╛рдВ рд╣рдо рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЗрд╕рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ $VALUES
:BootstrapMethods:
...
1: # 54 REF_invokeStatic FizzBuzz.createValues: (Ljava / lang / invoke / MethodHandles $ рд▓реБрдХрдЕрдк; Ljava / lang / String; Ljava / lang / Class; [LFizzBuzz;) [LFizzBuzz]
рд╡рд┐рдзрд┐ рддрд░реНрдХ:
# 1 # 0: Fizz: LFizzBuzz;
# 2 # 0: рдмрдЬрд╝: LFizzBuzz;
# 3 # 0: FizzBuzz: LFizzBuzz;
JVM рдЗрди рд╕реНрдереИрддрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рд╕рд░рдгреА рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ varar рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдореЗрдВ рднреЗрдЬ рджреЗрддрд╛ рд╣реИ elements
ред рд╕реНрдерд┐рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ 65_535 рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЧрдгрдирд╛ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдЪрд╛рд╣реЗ рдХрд┐рддрдиреЗ рднреА рд╣реЛрдВредрдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░рд┐рдгрд╛рдореА рдХрдХреНрд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рддрддреНрд╡реЛрдВ рдХреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдХрд╛рд░рдг, рд╡рд┐рдзрд┐ createValues()
рдХреЛ рдХрдИ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рддреЛ рдпрд╣ рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдореЗрдВ рд╕реНрд▓реЙрдЯ рднреА рдмрдЪрд╛рддрд╛ рд╣реИредрдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рд╕реБрдВрджрд░ рд╣реИредрдЕрдЪрд╛рдирдХ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ
рдЬрд┐рд╕реЗ рд╣рдо рд╡реАрд░рддрд╛рдкреВрд░реНрд╡рдХ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛рдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдХреЗ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВредрдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреЗ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдПрдПрд╕рдПрдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рдо рдХрдХреНрд╖рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреВрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реАрдзреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВредрдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдмреНрд▓реЙрдХ рдореЗрдВ рдХреАрдорддреА рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдХреЗ рдкрд╣рд▓реЗ 255 рддрддреНрд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрдм рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ рдФрд░ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдЕрдзрд┐рдХрддрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛редрдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдЧрдард┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдПрдХ рдЦрдВрдбрд▓рдЧрд╛рддрд╛рд░ рдкреВрд▓:
# 1 = Utf8 FizzBuzz
#2 = Class #1 // FizzBuzz
#3 = Utf8 java/lang/Enum
#4 = Class #3 // java/lang/Enum
#5 = Utf8 $VALUES
#6 = Utf8 [LFizzBuzz;
#7 = Utf8 valueIndex
#8 = Utf8 I
#9 = Utf8 Fizz
#10 = Utf8 LFizzBuzz;
#11 = Utf8 Buzz
#12 = Utf8 FizzBuzz
#13 = Utf8 values
#14 = Utf8 ()[LFizzBuzz;
#15 = NameAndType #5:#6 // $VALUES:[LFizzBuzz;
#16 = Fieldref #2.#15 // FizzBuzz.$VALUES:[LFizzBuzz;
#17 = Class #6 // "[LFizzBuzz;"
#18 = Utf8 clone
#19 = Utf8 ()Ljava/lang/Object;
#20 = NameAndType #18:#19 // clone:()Ljava/lang/Object;
#21 = Methodref #17.#20 // "[LFizzBuzz;".clone:()Ljava/lang/Object;
...
#40 = NameAndType #9:#10 // Fizz:LFizzBuzz;
#41 = Dynamic #0:#40 // #0:Fizz:LFizzBuzz;
#42 = Fieldref #2.#40 // FizzBuzz.Fizz:LFizzBuzz;
#43 = NameAndType #11:#10 // Buzz:LFizzBuzz;
#44 = Dynamic #0:#43 // #0:Buzz:LFizzBuzz;
#45 = Fieldref #2.#43 // FizzBuzz.Buzz:LFizzBuzz;
#46 = NameAndType #12:#10 // FizzBuzz:LFizzBuzz;
#47 = Dynamic #0:#46 // #0:FizzBuzz:LFizzBuzz;
#48 = Fieldref #2.#46 // FizzBuzz.FizzBuzz:LFizzBuzz;
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ - рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдк рдПрдХ рдирдореВрдирд╛ рд╡рд░реНрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред рдХреЗрд╡рд▓ рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛редрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЙрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕-рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдореИрдиреБрдЕрд▓ рдкреАрдврд╝реА рдХреБрдЫ рд╣рдж рддрдХ рдердХрд╛рдК рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИредрдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдПрдХ рд╕реНрдкрд╖реНрдЯ рдпреЛрдЬрдирд╛ рд╣реИред COUNT
рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП :COUNT
рдкреНрд░рдХрд╛рд░ рд░рд┐рдХреЙрд░реНрдб CONSTANT_Dynamic
- рд╣рдорд╛рд░реЗ рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░рд╛рдВрдХCOUNT
рдЯрд╛рдЗрдк рд░рд┐рдХреЙрд░реНрдб CONSTANT_NameAndType
- рдПрдиреНрдпреВрдорд░реЗрд╢рди рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рдирд╛рдо рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рдЬреЛрдбрд╝реЗред рдкреНрд░рдХрд╛рд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧрд╛, рдпрд╣ рд╣рдорд╛рд░реА рдЧрдгрдирд╛ рдХрд╛ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИредCOUNT
рдЯрд╛рдЗрдк рд░рд┐рдХреЙрд░реНрдб CONSTANT_Utf8
- рд╕реАрдзреЗ рдПрдиреНрдпреВрдорд░реЗрд╢рди рддрддреНрд╡реЛрдВ рдХреЗ рдирд╛рдоCOUNT
рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдХреЙрд░реНрдб CONSTANT_Integer
- рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреА рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ordinal
- рд╡рд░реНрддрдорд╛рди рдФрд░ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд╛рдо, рдЧреБрдг, рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдЕрдиреНрдп рдЙрдмрд╛рдК рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдгред рдЬреЛ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ рд╡реЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреВрд▓ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдШрдЯрдХ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкреВрд▓ рдХреЗ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЬрд┐рди рд╕рднреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, elementNames
рд╡рд╣ рд╣рдорд╛рд░реЗ рдЧрдгрди рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ:int elementCount = elementNames.size();
int baseConDy = 1;
int baseNameAndType = baseConDy + elementCount;
int baseUtf8 = baseNameAndType + elementCount;
int baseInteger = baseUtf8 + elementCount;
int indexThisClass = baseInteger + elementCount;
int indexThisClassUtf8 = indexThisClass + 1;
int indexSuperClass = indexThisClassUtf8 + 1;
int indexSuperClassUtf8 = indexSuperClass + 1;
int indexBootstrapMethodsUtf8 = indexSuperClassUtf8 + 1;
int indexConDyDescriptorUtf8 = indexBootstrapMethodsUtf8 + 1;
int indexBootstrapMethodHandle = indexConDyDescriptorUtf8 + 1;
int indexBootstrapMethodRef = indexBootstrapMethodHandle + 1;
int indexBootstrapMethodNameAndType = indexBootstrapMethodRef + 1;
int indexBootstrapMethodName = indexBootstrapMethodNameAndType + 1;
int indexBootstrapMethodDescriptor = indexBootstrapMethodName + 1;
int constantPoolSize = indexBootstrapMethodDescriptor + 1;
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВредрд╢реБрд░реБрдЖрдд рдореЗрдВ - рдХреНрд▓рд╛рд╕ рдлрд╛рдЗрд▓ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░, рд╕рднреА рдХреЛ рдЬреНрдЮрд╛рдд рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ 0xCA 0xFE 0xBA 0xBE
рдФрд░ рдлрд╛рдЗрд▓ рдлреЙрд░реНрдореЗрдЯ рд╕рдВрд╕реНрдХрд░рдг:
u4(CLASS_FILE_SIGNATURE);
u4(version);
рддрдм - рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдПрдХ рдкреВрд▓:рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдкреВрд▓
u2(constantPoolSize);
for (int i = 0; i < elementCount; i++) {
u1u2u2(CONSTANT_Dynamic, i, baseNameAndType + i);
}
for (int i = 0; i < elementCount; i++) {
u1u2u2(CONSTANT_NameAndType, baseUtf8 + i, indexConDyDescriptorUtf8);
}
for (int i = 0; i < elementCount; i++) {
u1(CONSTANT_Utf8);
utf8(elementNames.get(i));
}
for (int i = 0; i < elementCount; i++) {
u1(CONSTANT_Integer);
u4(i);
}
u1(CONSTANT_Class);
u2(indexThisClassUtf8);
u1(CONSTANT_Utf8);
utf8(enumClassName);
u1(CONSTANT_Class);
u2(indexSuperClassUtf8);
u1(CONSTANT_Utf8);
utf8(JAVA_LANG_ENUM);
u1(CONSTANT_Utf8);
utf8(ATTRIBUTE_NAME_BOOTSTRAP_METHODS);
u1(CONSTANT_Utf8);
utf8(binaryEnumClassName);
u1(CONSTANT_MethodHandle);
u1(REF_newInvokeSpecial);
u2(indexBootstrapMethodRef);
u1u2u2(CONSTANT_Methodref, indexThisClass, indexBootstrapMethodNameAndType);
u1u2u2(CONSTANT_NameAndType, indexBootstrapMethodName, indexBootstrapMethodDescriptor);
u1(CONSTANT_Utf8);
utf8(BOOTSTRAP_METHOD_NAME);
u1(CONSTANT_Utf8);
utf8(BOOTSTRAP_METHOD_DESCRIPTOR);
рдкреВрд▓ рдирд┐рд░рдВрддрд░ рдкрд╣реБрдВрдЪ рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдЭрдВрдбреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж ( public
, final
, enun
, рдФрд░ рдЗрддрдиреЗ рдкрд░), рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдФрд░ рдЕрдкрдиреЗ рдкреВрд░реНрд╡рдЬ:u2(access);
u2(indexThisClass);
u2(indexSuperClass);
рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдбрдореА рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХреЛрдИ рдЗрдВрдЯрд░рдлреЗрд╕, рдХреЛрдИ рдлрд╝реАрд▓реНрдб, рдХреЛрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреА:
u2(0);
u2(0);
u2(0);
u2(1);
рдФрд░ рдпрд╣рд╛рдБ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╢рд░реАрд░ рд╣реА рд╣реИ:
u2(indexBootstrapMethodsUtf8);
u4(2 + 6 * elementCount);
u2(elementCount);
for (int i = 0; i < elementCount; i++) {
u2(indexBootstrapMethodHandle);
u2(1);
u2(baseInteger + i);
}
рдмрд╕ рдЗрддрдирд╛ рд╣реА, рд╡рд░реНрдЧ рдмрдирддрд╛ рд╣реИред рд╣рдо рдЗрди рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ ClassReader
:private ClassReader getBootstrapClassReader(int version, int access, String enumClassName, List<String> elementNames) {
byte[] bootstrapClassBytes = new ConDyBootstrapClassGenerator(
version,
access,
enumClassName,
elementNames
)
.generate();
if (bootstrapClassBytes == null) {
return null;
} else {
return new ClassReader(bootstrapClassBytes);
}
}
рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдерд╛редрдЬрдирд░реЗрдЯрд░ рд╕реНрд░реЛрдд рдХреЛрдб: ConDyBootstrapClassGenerator.javaрдЙрдЬреНрдЬрд╡рд▓ рднрд╡рд┐рд╖реНрдп
рд╣рдо рдЕрдкрдиреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд╕реЗ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП:
public class DiscoverConstantValueAttribute {
public static final String STRING = "Habrahabr, world!";
public static final Object OBJECT = new Object();
}
рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдЦрдВрдб рдореЗрдВ, рдЕрдЪрд╛рдирдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ OBJECT
:
static {
OBJECT = new Object();
}
рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреНрдпрд╛ STRING
?рдЯреАрдо рдЗрд╕ рдкрд╣реЗрд▓реА рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА javap -c -s -p -v DiscoverConstantValueAttribute.class
, рдпрд╣рд╛рдБ рд╡рд╣ рдЕрдВрд╢ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрддрд╛ рд╣реИ:
public static final java.lang.String STRING;
descriptor: Ljava/lang/String;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
ConstantValue: String Habrahabr, world!
рд╕реНрдереИрддрд┐рдХ рдЕрдВрддрд┐рдо рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рд╕реЗ рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ ConstantValue
ред рд╡реЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ JVMS11 .24.7.2 рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ :рдПрдХ ConstantValue рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (JLS .215.28) рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдпрджрд┐ field_info рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдПрдХреНрд╕реЗрд╕_рдлреНрд▓реИрдЧ рдЖрдЗрдЯрдо рдореЗрдВ ACC_STATIC рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ field_info рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рдлрд╝реАрд▓реНрдб рдХреЛ рдЙрд╕рдХреЗ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд╡реИрд▓реНрдпреВ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╡рд░реНрдЧ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (┬з5.5)ред рдпрд╣ рдЙрд╕ рд╡рд░реНрдЧ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (to2.9.2) рдХреЗ рд╡рд░реНрдЧ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рдЖрд╣реНрд╡рд╛рди рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИред
- рдЕрдиреНрдпрдерд╛, рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдЪреБрдкрдЪрд╛рдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╣реЛрддреА рд╣реИ static
рдФрд░ final
(рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ), рддреЛ рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рддрдм рднреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИредрдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЛрднрди рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ, рдпрджреНрдпрдкрд┐ рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рд▓реЗ рдереЗредрдФрд░ рд╣рдо рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИрдВ, рдЬреЗрдИрдкреА 309 рдореЗрдВ рдПрдХ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ ConstantValue
ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рд░реНрдп рдЕрдзреНрдпрд╛рдп рдореЗрдВ рд╣реИ:рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рдо
рд╕рдВрднрд╡ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
...
- рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд╡реИрд▓реНрдпреВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛
рдЗрд╕ рдмреАрдЪ, рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕ рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдкрдирд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд░рд╛рдЬреНрдп рд╕реЗ "рдЕрдЪреНрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП" "рддреИрдпрд╛рд░" рд╣реЛ рдЬрд╛рдПрдЧреАред рддрдм рдЖрд░рдВрднреАрдХрд░рдг рдмреНрд▓реЙрдХ рдореЗрдВ рдХреЛрдб рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдЕрдкрдирд╛ рдкреНрд░рднрд╛рд╡ рдЦреЛ рджреЗрдВрдЧреЗ рдФрд░ рдЧрдгрдирд╛ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧреАредрдореЛрдЯреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдПрдХ 65 489 / 4 = 16_372
рддрддреНрд╡ рдХреА рдЖрд╢рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрд╣рд╛рдВ 65_489
рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдХреЗ рдирд┐рд░реНрдмрд╛рдз рд╕реНрд▓реЙрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ 65_535 рдореЗрдВ рд╕реЗ 46 рдУрд╡рд░рд╣реЗрдб рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред 4
- рдПрдХ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдЗрд╕реА рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрд▓реЙрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛редрдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдЬреЗрдбреАрдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдЕрд╕реБрд░рдХреНрд╖рд┐рдд
рд╣рдорд╛рд░рд╛ рджреБрд╢реНрдорди рдЧрдгрдирд╛ рддрддреНрд╡ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХрд░рдг рдмреНрд▓реЙрдХ рдХреА рд░реИрдЦрд┐рдХ рд╡реГрджреНрдзрд┐ рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рд▓реВрдк рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдФрд░ рд╕рдлрд▓рддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░реЗрдВрдЧреЗредрджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдорд╛рдирдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рд╕реЗ рдХреЛрдИ static final
рднреА рдПрдХ рд╕реНрдерд┐рд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рднреА рдлрд╝реАрд▓реНрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ ред рдпрд╣рд╛рдВ рди рддреЛ рдкрд░рд╛рд╡рд░реНрддрди рдФрд░ рди рд╣реА рд╡рд░реИрдВрдбрд▓реНрд╕ рдорджрдж рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реА рдПрдХрдорд╛рддреНрд░ рдЖрд╢рд╛ рдорд╣рд╛рди рдФрд░ рднрдпрд╛рдирдХ рд╣реИ sun.misc.Unsafe
редFizzBuzz рдХрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:рдЕрд╕реБрд░рдХреНрд╖рд┐рдд FizzBuzzimport java.lang.reflect.Field;
import sun.misc.Unsafe;
public enum FizzBuzz {
private static final FizzBuzz[] $VALUES;
public static final FizzBuzz Fizz;
public static final FizzBuzz Buzz;
public static final FizzBuzz FizzBuzz;
public static FizzBuzz[] values() {
return (FizzBuzz[]) $VALUES.clone();
}
public static FizzBuzz valueOf(String name) {
return (FizzBuzz) Enum.valueOf(FizzBuzz.class, name);
}
private FizzBuzz(String name, int ordinal) {
super(name, ordinal);
}
private static FizzBuzz[] createValues() {
return new FizzBuzz[] {
Fizz,
Buzz,
FizzBuzz
}
}
static {
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
String[] fieldNames = "Fizz,Buzz,FizzBuzz".split(",");
for(int i = 0; i < fieldNames.length; i++) {
String fieldName = fieldNames[i];
Field field = FizzBuzz.class.getDeclaredField(fieldName);
long fieldOffset = unsafe.staticFieldOffset(field);
unsafe.putObject(FizzBuzz.class, fieldOffset, new FizzBuzz(fieldName, i));
}
$VALUES = createValues();
}
}
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрдВ рд▓рдЧрднрдЧ 21 рд╣рдЬрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЬреНрдЮрд╛рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреВрд▓ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред Enum :: ordinal ()рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорд╛рди рдЧрдгрди рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡ рдХреА рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдХрдХреНрд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рд▓рдЧрднрдЧ рджреЛрдЧреБрдирд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛редрд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдВрддрд┐рдо рдЖрддрдВрд░рд┐рдХ ()
рдЗрд╕ рдЧрдгрдирд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдХреНрд░рдорд┐рдХ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдХреА рдЕрдкрдиреА рдШреЛрд╖рдгрд╛ рдореЗрдВ, рдЬрд╣рд╛рдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рд╢реВрдиреНрдп рдХрд╛ рдПрдХ рдХреНрд░рдо рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдпрд╣рд╛рдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рд╣рдореЗрдВ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рднрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реА рдХреЛрдИ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдХрднреА рднреА рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред OpenJDK рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХреНрд▓рд╛рд╕ :: getConstantPool () рдкрджреНрдзрддрд┐ рдХреЛ рдкреИрдХреЗрдЬ-рдирд┐рдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЬрд▓реНрджрдмрд╛рдЬреА рд╣реЛрдЧреАредрдЖрд░рдВрднреАрдХрд░рдг рдмреНрд▓реЙрдХ рдЕрдм рдХрд╛рдлреА рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИ рдФрд░ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд▓рдЧрднрдЧ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк createValues()
рдЗрд╕реЗ рдЕрдкрдиреЗ рд╢рд░реАрд░ рдХреЛ рд▓реВрдк рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдХреЗ рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:static {
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
String[] fieldNames = "Fizz,Buzz,FizzBuzz".split(",");
FizzBuzz[] localValues = new FizzBuzz[fieldNames.length];
for(int i = 0; i < fieldNames.length; i++) {
String fieldName = fieldNames[i];
Field field = FizzBuzz.class.getDeclaredField(fieldName);
long fieldOffset = unsafe.staticFieldOffset(field);
unsafe.putObject(
FizzBuzz.class,
fieldOffset,
(localValues[i] = new FizzBuzz(fieldName, i))
);
}
$VALUES = localValues;
}
рдпрд╣рд╛рдВ рдПрдХ рд╣рд┐рдорд╕реНрдЦрд▓рди рдЬреИрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИ: рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде createValues()
, рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдкрдврд╝рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, Fieldref
рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд░рд┐рдХреЙрд░реНрдб рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ , рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ NameAndType
рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рд░рд┐рдХреЙрд░реНрдб рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ Fieldref
ред рдирд┐рд░рдВрддрд░ рдкреВрд▓ рдореЗрдВ, 2 * < >
рд╕реНрд▓реЙрдЯреНрд╕ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдгрди рддрддреНрд╡реЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд░рд╕рджрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ: 65 рд╣рдЬрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрдгрди рд╡рд░реНрдЧ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рдЕрдХрд▓реНрдкрдиреАрдп рдбреЗрдврд╝ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдирд┐рдХрд▓рд╛, "рдкрд▓рдЯрд╛ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред" OpenJDK рдореЗрдВ рдХреНрд▓рд╛рд╕ :: getDeclaredField ()рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрд▓рд╛рд╕ рдореЗрдВ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдПрдХ рд░реИрдЦрд┐рдХ рдЕрд╕рдордорд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рд╣рдорд╛рд░рд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рджреНрд╡рд┐рдШрд╛рдд рд╣реИредрдХреИрд╢рд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:static {
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
String[] fieldNames = "Fizz,Buzz,FizzBuzz".split(",");
Field[] fields = FizzBuzz.class.getDeclaredFields();
HashMap<String, Field> cache = new HashMap<>(fields.length);
for(Field field : fields) {
cache.put(field.getName(), field);
}
for (int i = 0; i < fieldNames.length; i++) {
String fieldName = fieldNames[i];
Field field = cache.get(fieldName);
long fieldOffset = unsafe.staticFieldOffset(field);
unsafe.putObject(
FizzBuzz.class,
fieldOffset,
(localValues[i] = new FizzBuzz(fieldName, i))
);
}
$VALUES = localValues;
}
рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ 65_410 рддрдХ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ javac рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд▓рдЧрднрдЧ 24 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдЪрдХреНрд░ рдХреЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХреА рдЧрдИ 65_505 рддрддреНрд╡реЛрдВ рдХреА рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╕реАрдорд╛ рдХреЗ рдХрд╛рдлреА рдХрд░реАрдм рд╣реИредрдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ java -jar HugeEnumGen.jar -a Unsafe UnsafeHugeEnum
ред рдирддреАрдЬрддрди, рд╣рдореЗрдВ 2 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдФрд░ 65_410 рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИредрдЖрдИрдбреАрдИрдП рдореЗрдВ рдПрдХ рдирдпрд╛ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝реЗрдВредрд▓рдЧрднрдЧ рддреБрд░рдВрдд, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдИрдбреАрдИрдП рдЗрд╕ рддрд░рд╣ рдХреЗ рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ:
рдПрдХ рд╕рдВрд▓рдпрди рддрддреНрд╡ рдХреЗ рдСрдЯреЛ-рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рд╛рдЪреАрди рдореЛрдмрд╛рдЗрд▓ i5 рдФрд░ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ i7 8700K рджреЛрдиреЛрдВ рдкрд░ рджрд╕рд┐рдпреЛрдВ рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рдЖрдк рд╕реНрд╡рд┐рдЪ рдореЗрдВ рд▓рд╛рдкрддрд╛ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рд┐рдд рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдИрдбреАрдИрдП рднреА рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреА рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИредрдЪрд▓реЛ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ switch
:public class TestFew {
public static void main(String... args) {
for(String arg : args) {
System.out.print(arg + " : ");
try {
UnsafeHugeEnum value = UnsafeHugeEnum.valueOf(arg);
doSwitch(value);
} catch(Throwable e) {
e.printStackTrace(System.out);
}
}
}
private static void doSwitch(UnsafeHugeEnum value) {
switch(value) {
case VALUE_00001:
System.out.println("First");
break;
case VALUE_31415:
System.out.println("(int) (10_000 * Math.PI)");
break;
case VALUE_65410:
System.out.println("Last");
break;
default:
System.out.println("Unexpected value: " + value);
break;
}
}
}
рдпрд╣рд╛рдВ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реИ, рд╕рдВрдХрд▓рди рдФрд░ рд▓реЙрдиреНрдЪ рдирд┐рдпрдорд┐рдд рд╣реИрдВ:$ java TestFew VALUE_00001 VALUE_00400 VALUE_31415 VALUE_65410
VALUE_00001 : First
VALUE_00400 : Unexpected value: VALUE_00400
VALUE_31415 : (int) (10_000 * Math.PI)
VALUE_65410 : Last
рдореЗрдВ рдФрд░ рдЖрдЗрдЯрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ switch
? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╣рдо рдПрдХ switch
рдмрд╛рд░ рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА 65 рд╣рдЬрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ?switch(value) {
case VALUE_00001:
case VALUE_00002:
...
case VALUE_65410:
System.out.println("One of known values: " + value);
break;
default:
System.out.println("Unexpected value: " + value);
break;
}
рдХрд╛рд╢, рдирд╣реАрдВред рдЬрдм рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:$ javac -fullversion
javac full version "14.0.1+7"
$ javac TestAll.java
TestAll.java:18: error: code too large for try statement
switch(value) {
^
TestAll.java:65433: error: too many constants
break;
^
TestAll.java:17: error: code too large
private static void doSwitch(UnsafeHugeEnum value) {
^
TestAll.java:1: error: too many constants
public class TestAll {
^
4 errors
рдЬрд╛рд╡рд╛рдХ рдФрд░ рд╕реНрд╡рд┐рдЪ
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ switch
рдЧрдгрдирд╛ рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ редJVM рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдореЗрдВ JVMS11 .103.10 рдХрдВрдкрд╛рдЗрд▓рд┐рдВрдЧ рд╕реНрд╡рд┐рдЪреЗрд╕ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЪреИрдкреНрдЯрд░ рд╣реИ , рдЬрд┐рд╕рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ switch
рджреЛ рдмрд╛рдИрдЯреЗрдХрдХреЛрдб рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдмрд╛рд▓рддреА рд╣реИрдВ , tableswitch
рдпрд╛ lookupswitch
ред switch
рд╣рдо рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рддрд╛рд░ рдпрд╛ рдЧрдгрди рддрддреНрд╡реЛрдВ рдХрд╛ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗредрд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд▓реЗрдЦрди рдХреЛрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрд░реЛрдд рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ javac
редрдЪреБрдирд╛рд╡ рдХреЗ рдмреАрдЪ tableswitch
рдФрд░ lookupswitch
рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдирд░рд▓ :: visitSwitch () рдФрд░ рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ switch
ред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬреАрдд tableswitch
:
long table_space_cost = 4 + ((long) hi - lo + 1);
long table_time_cost = 3;
long lookup_space_cost = 3 + 2 * (long) nlabels;
long lookup_time_cost = nlabels;
int opcode =
nlabels > 0 &&
table_space_cost + 3 * table_time_cost <=
lookup_space_cost + 3 * lookup_time_cost
?
tableswitch : lookupswitch;
рд╣реЗрдбрд░ tableswitch
рд▓рдЧрднрдЧ 16 рдмрд╛рдЗрдЯреНрд╕ рдкреНрд▓рд╕ 4 рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рддрд┐ рдорд╛рди рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, switch
рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдзрд┐рдХ ( 65_535 - 16 ) / 4 = 16_379
рддрддреНрд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВредрд╡рд╛рд╕реНрддрд╡ case
рдореЗрдВ, рд╢рд░реАрд░ рдореЗрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ switch
16 рд╣рдЬрд╛рд░ рддрдХ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж , рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реИ, рд╕рдмрд╕реЗ рд░рд╣рд╕реНрдпрдордп:TestAll.java:18: error: code too large for try statement
switch(value) {
^
рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрд░реЛрдд рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдкрд╣рд▓реЗ рд▓реМрдЯреЗрдВрдЧреЗ, рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВред switch
рддрд░реАрдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ visitEnumSwitch()
, mapForEnum()
рдФрд░ рд▓реЛрдЕрд░.рдЬрд╡рд╛EnumMapping
рдореЗрдВ рд╡рд░реНрдЧ ред рд╡рд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рдбреЙрдХреНрдпреВрдореЗрдВрдЯреНрд░реА рднреА рдорд┐рд▓реА:рд░рд╣рд╕реНрдпрдордп рддрд░реАрдХреЗ рд╕реЗ try
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ TestAll$0
ред рдЕрдВрджрд░ - рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╕рд░рдгреА рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдбредрд╕рд░рдгреА рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╕рдВрдХрд▓рд┐рдд рддрддреНрд╡реЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ switch
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ , рдЬрд┐рд╕рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдХреЗ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдкреНрд░рднрд╛рд╡реЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИредрдЬрдм рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рдирдП рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рдореМрдЬреВрджрд╛ рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореВрд▓реНрдп рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ ordinal()
рдФрд░ рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕реНрддрд░ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрд░ рдмрдЪрд╛рддрд╛ рд╣реИредtry {
$SwitchMap$UnsafeHugeEnum[UnsafeHugeEnum.VALUE_00001.ordinal()] = 1;
}
catch(NoSuchFieldError e) { }
рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рд╕рд░рд▓ рд╣реИ рдФрд░ рдкреНрд░рддрд┐ рддрддреНрд╡ 15 рд╕реЗ 17 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдмреНрд▓реЙрдХ 3_862 рд╕реЗ рдЕрдзрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рд╣рдо switch
рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ javac
редрдирд┐рд╖реНрдХрд░реНрд╖
рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд░рд▓ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреИрд╕реЗ рдХрд┐ рдПрдиреНрдпреВрдорд░реЗрд╢рди рддрддреНрд╡реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдХ рд╕рд░рдгреА $VALUES
рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрд░рдореНрдн рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 2_746 рд╕реЗ рдмрдврд╝рд╛рдХрд░ 10_920 рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИредрдкрд┐рдЫрд▓реА рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдЧрд╛рддрд╛рд░ рдЧрддрд┐рд╢реАрд▓ рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ 43 рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдореЗрдВ рдирдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИ - рдмрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░ рдХреЗ рд╕реНрдерд┐рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рдкрд╛рд╕ рдХрд░реЗрдВредрднрд╡рд┐рд╖реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдХреБрдЫ рд╕рдордп рддреЛ ConstantValue
рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рд╕рдВрдЦреНрдпрд╛ 16 рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 10 рд╣рдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝ рд╕рдХрддрд╛ рд╣реИрдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВsun.misc.Unsafe
рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЫрд▓рд╛рдВрдЧ рд▓рдЧрд╛рдиреЗ рдФрд░ рдЕрдзрд┐рдХрддрдо рддрддреНрд╡реЛрдВ рдХреЛ рдмрдврд╝рд╛рдХрд░ 65_410 рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ Unsafe
рдпрд╣ рдПрдХ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдЧрд╛рдпрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрд╡реИрдХ рд╕реАрдзреЗ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ:Test.java:3: warning: Unsafe is internal proprietary API and may be removed in a future release
import sun.misc.Unsafe;
^
рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╕рдВрдЪрдп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЖрдИрдбреАрдИ рдФрд░ рдЬрд╛рд╡рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрддрд░ рд╕реЗ рдРрд╕реЗ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВредрдХрдХреНрд╖рд╛ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╕рдВрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЖрдИрдбреАрдИ рдХреА рдЬрд╡рд╛рдмрджреЗрд╣реА рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрднреА-рдХрднреА рдкреВрд░реНрдг рд▓рдЯрдХрд╛ рддрдХредрд╡рд░реНрдЧ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдФрд░ javac рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рдкреНрд░рддрд┐рдмрдВрдз switch
рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреЛрдб рдореЗрдВ 3_862 рд╕реЗ рдЕрдзрд┐рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВ ред рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпреЗ 3_862 рддрддреНрд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВредрдЬрд╛рд╡рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╢реЛрдзрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдФрд░ рд╕реБрдзрд╛рд░ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИредрдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдордЧреНрд░реА
GitHub рд╕реНрд░реЛрдд рдХреЛрдб: https://github.com/Maccimo/HugeEnumGeneratorArticleрдПрдХрддреНрд░рд┐рдд рдХреА рдЧрдИ JAR рдлрд╝рд╛рдЗрд▓: https://github.com/Maccimo/HugeEnumGeneratorArticle/tag/v1.0рд╕рдорд░реНрдерд┐рдд рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рд╣рд╛рдпрддрд╛
Huge enumeration generator
https://github.com/Maccimo/HugeEnumGeneratorArticle
Additional information (in Russian):
https://habr.com/ru/post/483392/
https://habr.com/ru/post/501870/
Usage:
java -jar HugeEnumGen.jar [ <options> ] <enum name>
<enum name>
An enumeration class name.
Should be a valid Java identifier. May contain package name.
Options:
-d <directory>
Output directory path.
Current working directory by default.
-e <item list file>
Path to UTF8-encoded text file with list of enumeration item names.
Item names will be autogenerated if absent.
Mutually exclusive with the -c option.
-c <count>
Count of autogenerated enumeration item names.
Mutually exclusive with the -e option.
Default value: Algorithm-depended
-a <algorithm>
Enumeration generation algorithm.
Supported algorithms:
ConDy - Employ Constant Dynamic (JEP 309) for enum elements initialization
ExtractMethod - Extract enum elements initialization code to separate method
Unsafe - Employ sun.misc.Unsafe for enum elements initialization
Default algorithm: ExtractMethod
-h / -?
Show this help page.
Example:
java -jar HugeEnumGen.jar -d ./bin -c 2020 com.habr.maccimo.HugeEnum2020