lafayette
@lafayette

Java: Как передать исключение в конструкторе singleton-класса в getInstance()?

Есть примерно такой код (в данном случае — нерабочий):

public class SingletonClass {
	public SingletonClass() throws Throwable {
		/* ... */
	}

	public static SingletonClass getInstance() throws Throwable {
		return SingletonHolder.instance;
	}

	private static class SingletonHolder {
		public static SingletonClass instance = new SingletonClass();
	}
}



Т.е. мне нужно передать исключение конструктора в getInstance(), но т.к. оно инициализируется статически (пробовал в т.ч. и через static { }), мне не задать throws.


Надеюсь, понятно объяснил :)
  • Вопрос задан
  • 3517 просмотров
Решения вопроса 1
javax
@javax
Software Architect, Java Developer since 1996
В таком варианте — никак.
Решения
1. Используйте Spring для синглетонов (лучше всего)
2. Извращение — в кoнструкторе сделайте try{}catch{}(). Если есть эксепшн — сохраните его в еще одной статической переменной. getInstance() будет проверять — если сохранен эксепшн — его выбросит, если нет — пойдет в поле с инстансом и вернет его. Только я бы так не делал :)
3. Инициализация синглетона в начале программы. В одном месте. ТОгда можно не писать getInstance() а использовать public static поле класса

Серьезно — если конструктор синглетона может бросить эксепшн — use Spring, Luke
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
alexeygrigorev
@alexeygrigorev
Переворачиватель пингвинов
А чем такой код не подходит?

public class ThrowSingleton {
	static public void main(String args[]) throws Throwable {
		SingletonClass.getInstance().toString();
		
	}
}

class SingletonClass {
	public SingletonClass() throws Throwable {
		throw new Exception();
	}

	private static SingletonClass instance;
	
	public static SingletonClass getInstance() throws Throwable {
		if (instance != null) {
			instance = new SingletonClass();
		}
		
		return SingletonClass.instance;
	}
}


Не очень понял, зачем делать приватный подкласс, который держит синглтон.
Ответ написан
apangin
@apangin
Первы два варианта отсюда вам подойдут.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы