Log in

Этот момент, лично мне, кажется, мягко говоря, спорным. As of… - Alexander Dolgin
June 22nd, 2008
11:56 pm


Previous Entry Share Next Entry
Этот момент, лично мне, кажется, мягко говоря, спорным.

As of release 1.5, there is a third approach to implementing singletons. Simply
make an enum type with one element:
// Enum singleton - the preferred approach
public enum Elvis {
   public void leaveTheBuilding() { ... }

This approach is functionally equivalent to the public field approach, except that it
is more concise, provides the serialization machinery for free, and provides an
ironclad guarantee against multiple instantiation, even in the face of sophisticated
serialization or reflection attacks. While this approach has yet to be widely
adopted, a single-element enum type is the best way to implement a singleton.

Я бы скорее сделал, хотя бы, что-то такое:
public interface IElvis

public class DefaultElvis implements IElvis
   private static IElvis Instance_ = new DefaultElvis();
   public static IElvis getInstance() {return Instance_;}


(7 comments | Leave a comment)

[User Picture]
Date:June 23rd, 2008 06:21 am (UTC)
Надо подумать, зачем бы это понадобился такой трюк. Холдер класс сейчас стал как бы мировым стандартом.
Date:July 3rd, 2008 10:02 am (UTC)
Чтобы при де-сериализации не создался второй объект ("even in the face of sophisticated
serialization or reflection attacks")
[User Picture]
Date:July 3rd, 2008 02:41 pm (UTC)
Для этого нормально использовать readRelove()
(Deleted comment)
[User Picture]
Date:June 23rd, 2008 07:52 am (UTC)
Иная простота -- хуже воровства :)

Аналог методов foo() и bar().
[User Picture]
Date:June 25th, 2008 08:35 pm (UTC)
по-моему есть хорошее правило - используй инстрУмент по назначению

назначение енумов, с моей точки зрения, ну никак не держать синглтоны, тем более что нормальной lazy initialization оно все равно не умеет
Date:September 28th, 2008 11:15 pm (UTC)
Очень понравился ваш ЖЖ, я вас зафренжу и было бы круто если бы вы ответили взаимно;)
Date:October 7th, 2008 12:23 am (UTC)
Hi Alex,
Your approach from what i see is not safe in multi threaded environment, plus you are doing eager initialization.

or am i missing something?

Single-element enum type is final, and is safe against reflection attacks.
Powered by LiveJournal.com