2016-08-31 4 views
0

У меня есть библиотека и создать экземпляр, я использую метод connectWith() для отправки модели базы данных:Принудительно вызов метода, чтобы избежать бросать исключение

Wallet wallet = new WalletPoket(); 
wallet.connectWith(
    DAOFactory.getDAOFactory(DAOFactory.MYSQL) 
); 

СЛЕДОВАЛА эти методы:

int privateCardId = wallet.addCard(1, "Economy 1"); 
boolean wasDeleted = wallet.deleteCard(privateCardId); 
... 

Вызов предыдущих методов приведет к исключению NullPointerException, если метод connectWith() не вызывается ранее. Можно ли заставить пользователя вызвать метод connectWith() или представить пользователю предупреждение, если это не так? Было бы приемлемо вызывать метод из конструктора?

Wallet wallet = new WalletPoket(
    DAOFactory.getDAOFactory(DAOFactory.MYSQL) 
); 

Что было бы лучшей альтернативой?

+2

Вы можете добавить более специфичное 'NotConnectedException' и убедиться, что это указано, что именно так вы используете свой API. Я также думаю, что добавление его к вашему конструктору было бы хорошим способом. – jacob

+0

Если вы отвечаете за библиотеку, вы можете просто набросить пользовательские 'IllegalStateException', ** заставляя их их вызывать. В документации вашей библиотеки также должно быть четко разъяснено это требование. –

+1

Лучше всего использовать его в конструкторе, желательно в качестве переданного параметра. В противном случае ваш конструктор возвращает частично инициализированный объект. – bradimus

ответ

4

У вас есть несколько вариантов.

  1. Заставить пользователя передать параметр в качестве аргумента конструктору.
  2. Вызвать исключение с сообщением о том, что connectWidth должен вызываться, если он не был вызван.
  3. Если есть хорошая связь по умолчанию, то подключайтесь к ней в конструкторе.
0

Если addCard и deleteCard вызовы методов имеют решающее значение для функциональности Object «s (т.е. почти всегда называют), а затем добавить его в качестве конструктора.

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

1

Это где вещи становятся немного многословным, так как это означает:

  • Вы должны проверить состояние, прежде чем делать что-нибудь и
  • Вы должны остерегаться разработчиков делать глупые вещи.

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

if(null == daoFactory) { 
    throw new IllegalStateException("You are attempting to invoke this without a DAO Factory defined."); 
} 

... но вы бы необходимо добавить эту проверку ко всем методам, которые были у вас в вашей программе.

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

Последнее, что вы могли бы сделать, это сделать некоторые фантазии annotation processing, чтобы заставить определенное предупреждение компилятора или ошибку должна эта зависимость пропадает, но это, вероятно, гораздо более простой, чтобы добавить его в качестве конструктора зависимости вместо этого.

0

Класс (библиотека) Wallet должен был предоставить конструктор, который принимает конечную точку базы данных. Поскольку он недоступен, вы можете предоставить служебную оболочку, которая учитывает это. Таким образом, ваша утилитная оболочка может назначить конечную точку и убедиться, что она доступна заранее.

Еще одна вещь, которую вы можете изучить, - это инъекция зависимостей, то есть всякий раз, когда клиенту нужен Wallet, он делает @Inject Wallet wallet. Это, по общему признанию, добавило сложности, но это делает код более легко проверяемым. (См. Javax.inject, или кинжал).

0

Я думаю, вы должны реализовать шаблон прокси-сервера, чтобы решить проблему. Когда клиент создает Кошелек, он должен получить прокси-экземпляр экземпляра Кошелька. Когда клиент вызывает API-интерфейс службы поддержки, добавляется экземпляр addCard, а экземпляр объекта Real Wallet входит в изображение (ленивая загрузка) и создает экземпляр dao, который является экземпляром singleton.

+0

, пожалуйста, напишите свой ответ, а затем описание. – Sachith

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