рдПрдирдо рднрд╛рдЧ II рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдорд╛рди

рднрд╛рдЧ рдПрдХ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ  | рднрд╛рдЧ рджреЛ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ



рд╣рдо рдЧрдгрдирд╛ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдЗрд╕ рдмрд╛рд░ рд╣рдо рдореБрджреНрджреЗ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрдХреНрд╖ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдИрдбреАрдИ, рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдЬреЗрд╡реАрдПрдо рд╣рдорд╛рд░реА рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдХреИрд╕реЗ рджреЗрдВрдЧреЗред

рд╕рд╛рдордЧреНрд░реА


тАГтАГ
тАГтАГ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);
    //  0: new           #2                  // class FizzBuzz
    //  3: dup
    //  4: ldc           #22                 // String Fizz
    //  6: iconst_0
    //  7: invokespecial #24                 // Method "<init>":(Ljava/lang/String;I)V
    // 10: putstatic     #25                 // Field Fizz:LFizzBuzz;
    Buzz = new FizzBuzz("Buzz", 1);
    // 13: new           #2                  // class FizzBuzz
    // 16: dup
    // 17: ldc           #28                 // String Buzz
    // 19: iconst_1
    // 20: invokespecial #24                 // Method "<init>":(Ljava/lang/String;I)V
    // 23: putstatic     #30                 // Field Buzz:LFizzBuzz;
    FizzBuzz = new FizzBuzz("FizzBuzz", 2);
    // 26: new           #2                  // class FizzBuzz
    // 29: dup
    // 30: ldc           #32                 // String FizzBuzz
    // 32: iconst_2
    // 33: invokespecial #24                 // Method "<init>":(Ljava/lang/String;I)V
    // 36: putstatic     #33                 // Field FizzBuzz:LFizzBuzz;

    $VALUES = new FizzBuzz[] {
    // 39: iconst_3
    // 40: anewarray     #2                  // class FizzBuzz
        Fizz, 
    // 43: dup
    // 44: iconst_0
    // 45: getstatic     #25                 // Field Fizz:LFizzBuzz;
    // 48: aastore
        Buzz, 
    // 49: dup
    // 50: iconst_1
    // 51: getstatic     #30                 // Field Buzz:LFizzBuzz;
    // 54: aastore
        FizzBuzz
    // 55: dup
    // 56: iconst_2
    // 57: getstatic     #33                 // Field FizzBuzz:LFizzBuzz;
    // 60: aastore
    };
    // 61: putstatic     #1                  // Field $VALUES:[LFizzBuzz;
    // 64: return
}


рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдорди рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╣реИ рд╕реГрдЬрди рдФрд░ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП $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 рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдирдХреЛрдВ рдкрд░ рдЕрдкрдиреЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рд╕реНрдерд╛рдиреАрдп рд▓реБрдХрдЕрдк рдСрдмреНрдЬреЗрдХреНрдЯ,
  2. рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░рдВрддрд░ рдХреЗ рдирд╛рдо рдШрдЯрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ,
  3. рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд░реНрдЧ, рдФрд░
  4. рдХрд┐рд╕реА рднреА рд╢реЗрд╖ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рддрд░реНрдХред

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рдФрд░ рдлрд╛рдЗрд▓ рдлреЙрд░реНрдореЗрдЯ рд╕рдВрд╕реНрдХрд░рдг:

// Class file header
u4(CLASS_FILE_SIGNATURE);
u4(version);

рддрдм - рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдПрдХ рдкреВрд▓:

рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдкреВрд▓
// Constant pool
u2(constantPoolSize);

// N * CONSTANT_Dynamic
for (int i = 0; i < elementCount; i++) {
    u1u2u2(CONSTANT_Dynamic, i, baseNameAndType + i);
}

// N * CONSTANT_NameAndType
for (int i = 0; i < elementCount; i++) {
    u1u2u2(CONSTANT_NameAndType, baseUtf8 + i, indexConDyDescriptorUtf8);
}

// N * CONSTANT_Utf8
//noinspection ForLoopReplaceableByForEach
for (int i = 0; i < elementCount; i++) {
    u1(CONSTANT_Utf8);
    utf8(elementNames.get(i));
}

// N * CONSTANT_Integer
for (int i = 0; i < elementCount; i++) {
    u1(CONSTANT_Integer);
    u4(i);
}

// ThisClass
u1(CONSTANT_Class);
u2(indexThisClassUtf8);

// ThisClassUtf8
u1(CONSTANT_Utf8);
utf8(enumClassName);

// SuperClass
u1(CONSTANT_Class);
u2(indexSuperClassUtf8);

// SuperClassUtf8
u1(CONSTANT_Utf8);
utf8(JAVA_LANG_ENUM);

// BootstrapMethodsUtf8
u1(CONSTANT_Utf8);
utf8(ATTRIBUTE_NAME_BOOTSTRAP_METHODS);

// ConDyDescriptorUtf8
u1(CONSTANT_Utf8);
utf8(binaryEnumClassName);

// BootstrapMethodHandle
u1(CONSTANT_MethodHandle);
u1(REF_newInvokeSpecial);
u2(indexBootstrapMethodRef);

// BootstrapMethodRef
u1u2u2(CONSTANT_Methodref, indexThisClass, indexBootstrapMethodNameAndType);

// BootstrapMethodNameAndType
u1u2u2(CONSTANT_NameAndType, indexBootstrapMethodName, indexBootstrapMethodDescriptor);

// BootstrapMethodName
u1(CONSTANT_Utf8);
utf8(BOOTSTRAP_METHOD_NAME);

// BootstrapMethodDescriptor
u1(CONSTANT_Utf8);
utf8(BOOTSTRAP_METHOD_DESCRIPTOR);


рдкреВрд▓ рдирд┐рд░рдВрддрд░ рдкрд╣реБрдВрдЪ рд╕рдВрд╢реЛрдзрдХ рдФрд░ рдЭрдВрдбреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж ( public, final, enun, рдФрд░ рдЗрддрдиреЗ рдкрд░), рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдФрд░ рдЕрдкрдиреЗ рдкреВрд░реНрд╡рдЬ:

u2(access);
u2(indexThisClass);
u2(indexSuperClass);

рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдбрдореА рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХреЛрдИ рдЗрдВрдЯрд░рдлреЗрд╕, рдХреЛрдИ рдлрд╝реАрд▓реНрдб, рдХреЛрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреА:

// Interfaces count
u2(0);
// Fields count
u2(0);
// Methods count
u2(0);
// Attributes count
u2(1);

рдФрд░ рдпрд╣рд╛рдБ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╢рд░реАрд░ рд╣реА рд╣реИ:

// BootstrapMethods attribute
u2(indexBootstrapMethodsUtf8);
// BootstrapMethods attribute size
u4(2 /* num_bootstrap_methods */ + 6 * elementCount);
// Bootstrap method count
u2(elementCount);

for (int i = 0; i < elementCount; i++) {
    // bootstrap_method_ref
    u2(indexBootstrapMethodHandle);
    // num_bootstrap_arguments
    u2(1);
    // bootstrap_arguments[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();
    //  0: new           #2                  // class java/lang/Object
    //  3: dup
    //  4: invokespecial #1                  // Method java/lang/Object."<init>":()V
    //  7: putstatic     #7                  // Field OBJECT:Ljava/lang/Object;
    // 10: return
}


рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреНрдпрд╛ 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 рдХрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

рдЕрд╕реБрд░рдХреНрд╖рд┐рдд FizzBuzz
import 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:

// Determine whether to issue a tableswitch or a lookupswitch
// instruction.
long table_space_cost = 4 + ((long) hi - lo + 1); // words
long table_time_cost = 3; // comparisons
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рдореЗрдВ, рд╢рд░реАрд░ рдореЗрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ switch16 рд╣рдЬрд╛рд░ рддрдХ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж , рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реИ, рд╕рдмрд╕реЗ рд░рд╣рд╕реНрдпрдордп:

TestAll.java:18: error: code too large for try statement
        switch(value) {
        ^

рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрд░реЛрдд рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдкрд╣рд▓реЗ рд▓реМрдЯреЗрдВрдЧреЗ, рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВред switchрддрд░реАрдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ visitEnumSwitch(), mapForEnum()рдФрд░ рд▓реЛрдЕрд░.рдЬрд╡рд╛EnumMapping рдореЗрдВ рд╡рд░реНрдЧ ред рд╡рд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рдбреЙрдХреНрдпреВрдореЗрдВрдЯреНрд░реА рднреА рдорд┐рд▓реА:



EnumMapping JavaDoc
/** This map gives a translation table to be used for enum
 *  switches.
 *
 *  <p>For each enum that appears as the type of a switch
 *  expression, we maintain an EnumMapping to assist in the
 *  translation, as exemplified by the following example:
 *
 *  <p>we translate
 *  <pre>
 *          switch(colorExpression) {
 *          case red: stmt1;
 *          case green: stmt2;
 *          }
 *  </pre>
 *  into
 *  <pre>
 *          switch(Outer$0.$EnumMap$Color[colorExpression.ordinal()]) {
 *          case 1: stmt1;
 *          case 2: stmt2
 *          }
 *  </pre>
 *  with the auxiliary table initialized as follows:
 *  <pre>
 *          class Outer$0 {
 *              synthetic final int[] $EnumMap$Color = new int[Color.values().length];
 *              static {
 *                  try { $EnumMap$Color[red.ordinal()] = 1; } catch (NoSuchFieldError ex) {}
 *                  try { $EnumMap$Color[green.ordinal()] = 2; } catch (NoSuchFieldError ex) {}
 *              }
 *          }
 *  </pre>
 *  class EnumMapping provides mapping data and support methods for this translation.
 */


рд░рд╣рд╕реНрдпрдордп рддрд░реАрдХреЗ рд╕реЗ tryрд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ TestAll$0ред рдЕрдВрджрд░ - рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╕рд░рдгреА рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдбред

рд╕рд░рдгреА рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╕рдВрдХрд▓рд┐рдд рддрддреНрд╡реЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ switchрд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ , рдЬрд┐рд╕рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдХреЗ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдкреНрд░рднрд╛рд╡реЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред

рдЬрдм рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рдирдП рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рдореМрдЬреВрджрд╛ рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореВрд▓реНрдп рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ ordinal()рдФрд░ рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕реНрддрд░ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрд░ рдмрдЪрд╛рддрд╛ рд╣реИред

try {
    $SwitchMap$UnsafeHugeEnum[UnsafeHugeEnum.VALUE_00001.ordinal()] = 1;
    //  9: getstatic     #2                  // Field $SwitchMap$UnsafeHugeEnum:[I
    // 12: getstatic     #3                  // Field UnsafeHugeEnum.VALUE_00001:LUnsafeHugeEnum;
    // 15: invokevirtual #4                  // Method UnsafeHugeEnum.ordinal:()I
    // 18: iconst_1
    // 19: iastore
}
// 20: goto          24
catch(NoSuchFieldError e) { }
// 23: astore_0

рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рд╕рд░рд▓ рд╣реИ рдФрд░ рдкреНрд░рддрд┐ рддрддреНрд╡ 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



All Articles