Java Application / Class Design - Как работают средства доступа в Java? - PullRequest
0 голосов
/ 21 октября 2008

Как мне написать функцию getDB () и правильно ее использовать?

Вот фрагмент кода моего объекта приложения:

public class MyApp extends UiApplication {

    private static PersistentObject m_oStore;
    private static MyBigObjectOfStorage m_oDB;

    static {
        store = PersistentStore.getPersistentObject(0xa1a569278238dad2L);
    }

    public static void main(String[] args) {
        MyApp theApp = new MyApp();
        theApp.enterEventDispatcher();
    }
    public MyApp() {
        pushScreen(new MyMainScreen());
    }

    // Is this correct?  Will it return a copy of m_oDB or a reference of m_oDB?
    public MyBigObjectOfStorage getDB() {
        return m_oDB;  // returns a reference
    }

}

Ответы [ 3 ]

1 голос
/ 21 октября 2008
public MyBigObjectOfStorage getDB() {
  return m_oDB;
}

Как вы говорите, это правильно. Он вернет копию ссылки , которая находится между копией и ссылкой.

Фактический экземпляр объекта, возвращаемый getDB (), является тем же объектом, на который ссылается m_oDB. Однако вы не можете изменить ссылку, возвращаемую методом getDB (), чтобы она указывала на другой объект, и фактически заставить локальный закрытый m_oDB указывать на новый объект. m_oDB по-прежнему будет указывать на объект, которым он уже был.

Подробнее см. http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html.

Несмотря на то, что, просматривая ваш код, вы никогда не устанавливаете m_oDB, поэтому getDB () всегда будет возвращать ноль.

0 голосов
/ 21 октября 2008

Я один из тех, кто очень против использования синглетонов и / или статики, поскольку это делает невозможным юнит-тестирование. Поскольку это опубликовано в соответствии с лучшими практиками, я предлагаю вам взглянуть на использование инфраструктуры внедрения зависимостей. Лично я пользуюсь и предпочитаю Google Guice .

0 голосов
/ 21 октября 2008
public MyBigObjectOfStorage getDB() {
    Object o = store.getContents();
    if ( o instanceof MyBigObjectOfStorage ) {
        return (MyBigObjectOfStorage) o;
    } else {
        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...