2010-02-24 4 views
2

Согласно документам App Engine, PersistenceManagerFactory должен быть создан только один раз в приложении.Почему PMF.java является «финальным» классом?

предоставляет этот образец:

package guestbook; 

import javax.jdo.JDOHelper; 
import javax.jdo.PersistenceManagerFactory; 

public final class PMF { 
    private static final PersistenceManagerFactory pmfInstance = 
     JDOHelper.getPersistenceManagerFactory("transactions-optional"); 

    private PMF() {} 

    public static PersistenceManagerFactory get() { 
     return pmfInstance; 
    } 
} 

Почему PMF.java должны быть «public final class» в дополнение к делает pmfInstance «private static final» объект?

ответ

6

Занятия должны быть окончательными, если у них нет веской причины.

Не существует прецедента, в котором вы хотели бы наследовать от PMF, поэтому он должен быть окончательным.

+0

Я согласен, хотя это обязательно вызовет дебаты. Возможно, вы захотите привести элемент в «Эффективная Java_», который согласен с вами. :-) –

+0

Учитывая, что конструктор уже закрыт, он все еще кажется излишним. Пункт 4 Эффективной Java оставляет окончательный вариант. – Yishai

1

PMF - это класс, который не должен быть инстанцирован, поскольку он не имеет состояния экземпляра или методов, он строго обеспечивает статические методы и глобальное состояние.

Пункт 4 в Effective Java предоставляет эту идиому, однако она не добавляет, что класс должен быть окончательным, поскольку было бы невозможно подклассифицировать его в любом случае с помощью частного конструктора. И там явно рекомендуется, чтобы частный конструктор был документирован, чтобы избежать точно путаницы, которую вы имеете.

Кроме того, этот образец кода предоставляет статическую инициализацию workaround для двойной проверки блокировки.

Смежные вопросы