enumeración de propiedades y efectos secundarios

Tengo una pregunta con respecto a la enumeración (puede ser una simple pero ...). Este es mi programa:

public class Hello { 
         public enum MyEnum 
         { 
               ONE(1), TWO(2); 
               private int value; 
               private MyEnum(int value) 
               { 
                    System.out.println("hello");  
                    this.value = value; 
               } 
               public int getValue() 
               { 
                    return value; 
               } 
        } 
        public static void main(String[] args)  
        { 
              MyEnum e = MyEnum.ONE; 
        } 
}

y mi pregunta es: ¿Por qué la salida es

hello
hello

y no

hello ?

¿Cómo está "yendo" el código dos veces al constructor? ¿Cuándo es la primera vez y cuándo es la segunda? ¿Y por qué el constructor enum no puede ser público? ¿Es la razón por la que se imprime dos veces y no solo una vez?