Về câu hỏi (1): Câu trả lời từ Jon là chính xác, vì anh ta ngầm đánh dấu lớp 'Nested' riêng tư bằng cách không công khai hoặc nội bộ :-). Bạn cũng có thể làm điều đó một cách rõ ràng bằng cách thêm 'riêng tư':
private class Nested
Về câu hỏi (2): về cơ bản những gì bài viết về beforeinitfield và khởi tạo kiểu cho bạn biết là nếu bạn không có hàm tạo tĩnh, thời gian chạy có thể khởi tạo nó bất cứ lúc nào (nhưng trước khi bạn sử dụng nó). Nếu bạn có một hàm tạo tĩnh, mã của bạn trong hàm tạo tĩnh có thể khởi tạo các trường, điều đó có nghĩa là thời gian chạy chỉ được phép khởi tạo trường khi bạn yêu cầu loại.
Vì vậy, nếu bạn không muốn bộ thực thi khởi tạo các trường 'một cách chủ động' trước khi bạn sử dụng chúng, hãy thêm một hàm tạo tĩnh.
Dù bằng cách nào, nếu bạn đang triển khai các singletons, bạn sẽ muốn nó khởi tạo càng lười càng tốt và không phải khi thời gian chạy nghĩ rằng nó sẽ khởi tạo biến của bạn - hoặc có lẽ bạn không quan tâm. Từ câu hỏi của bạn, tôi cho rằng bạn muốn họ càng muộn càng tốt.
Điều đó đã đáp ứng bài đăng của Jon về singleton , đó là IMO chủ đề cơ bản của câu hỏi này. Oh và những nghi ngờ :-)
Tôi muốn chỉ ra rằng số 3 của anh ấy, được đánh dấu là 'sai', thực sự đúng (vì khóa tự động bao hàm một rào cản bộ nhớ khi thoát ). Nó cũng phải nhanh hơn singleton # 2 khi bạn sử dụng thể hiện nhiều hơn một lần (điều này ít nhiều là điểm của một singleton :-)). Vì vậy, nếu bạn thực sự cần một triển khai đơn lẻ lười biếng, có lẽ tôi sẽ thực hiện điều đó - vì những lý do đơn giản rằng (1) mọi người đều đọc mã của bạn những gì đang diễn ra và (2) bạn biết điều gì sẽ xảy ra với các ngoại lệ.
Trong trường hợp bạn đang tự hỏi: Tôi sẽ không bao giờ sử dụng singleton # 6 vì nó có thể dễ dàng dẫn đến bế tắc và hành vi bất ngờ với các ngoại lệ. Để biết chi tiết, xem: chế độ khóa của lazy , cụ thể là ExecutAndPublication.