Щодо питання (1): Відповідь Джона є правильною, оскільки він неявно позначає клас "Вкладений" приватним, не роблячи його публічним чи внутрішнім :-). Ви також можете це зробити прямо, додавши "приватне":
private class Nested
Щодо питання (2): в основному те, про що розповідає публікація про ініціалізацію перед типом і типом, це те, що якщо у вас немає статичного конструктора, час виконання може ініціалізувати його в будь-який час (але перед тим, як використовувати його). Якщо у вас є статичний конструктор, ваш код у статичному конструкторі може ініціалізувати поля, а це означає, що час виконання дозволено ініціалізувати поле лише тоді, коли ви запитаєте тип.
Тож якщо ви не хочете, щоб час виконання програми ініціалізував поля "проактивно" перед їх використанням, додайте статичний конструктор.
У будь-якому випадку, якщо ви реалізовуєте одиночні кнопки, ви хочете, щоб він ініціалізувався якомога лініше, а не тоді, коли під час виконання програми вважає, що він повинен ініціалізувати вашу змінну - або вам, мабуть, просто все одно. З вашого запитання, я думаю, ви хочете їх якомога пізніше.
Це знайшло зустріч з повідомленням Джона про одиночного , що є основним темою цього питання в ІМО. Ох і сумніви :-)
Я хотів би зазначити, що його одиночний номер 3, який він позначав "неправильним", насправді правильний (оскільки замок автоматично передбачає бар'єр пам'яті на виході ). Це також повинно бути швидшим, ніж сингл # 2, коли ви використовуєте екземпляр більше одного разу (що є більш-менш точкою одинарного :-)). Отже, якщо вам справді потрібна лінива реалізація синглтона, я, мабуть, пішов би саме з цієї причини - з простих причин, що (1) для всіх, хто читає ваш код, зрозуміло, що відбувається, і (2) ви знаєте, що буде за винятком.
У випадку, якщо вам цікаво: я б ніколи не використовував одиночний номер 6, оскільки це може призвести до тупиків та несподіваної поведінки за винятками. Докладніше див. У режимі блокування ледачих , зокрема ExecutionAndPublication.