Иногда на собеседованиях возникают странные вопросы, всегда следует ожидать неожиданного.;)
Любая используемая вами техника имеет свои плюсы и минусы.Вы должны знать, когда подходящее время их использовать, и в чем может быть проблема, и как их обойти.
Важно помнить, что почти у каждой проблемы есть решение или обходной путь.
В моем последнем интервью мне задали стандартный вопрос обо всех реализациях Singleton в Java.И как все они плохи.
Звучит не столько как вопрос, сколько как религиозная дискуссия.
И мне сказали, что даже статическая инициализация плоха из-завероятность непроверенного исключения в конструкторе:
Человек-паук IV: Человек-паук против Синглтона и Статического Инициализатора.(плохие парни;)
выбросить новое RuntimeException («Ух ... исключение в конструкторе Singleton ...»);
Это плохая идея, поэтомуне делай этогоНа самом деле это даже не скомпилируется.Компилятор в Java 6 сообщает.
initializer must be able to complete normally
И они также сказали мне, что Исключение будет "ClassNotFoundException", поэтому найти проблему в реальном приложении будет крайне сложно.
Вы получаете ExceptionInInitializerError с причиной исключения, вызвавшего проблему.Помимо необходимости читать вложенное исключение, это не так сложно.
static class Inner {
static {
Integer.parseInt(null);
}
}
public static void main(String... args) {
try {
new Inner();
} catch (Throwable e) {
e.printStackTrace();
}
new Inner();
}
печатает
Exception in thread "main" java.lang.ExceptionInInitializerError
at Main.main(Main.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:417)
at java.lang.Integer.parseInt(Integer.java:499)
at Main$Inner.<clinit>(Main.java:8)
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class Main$Inner
at Main.main(Main.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Это происходит в первый раз, после этого вы получите NoClassDefFoundError, есливы пытаетесь использовать класс снова.
Раньше когда вы пытались получить доступ к классу с помощью отражений, но не получалось, вы получали ClassNotFoundException (без подробностей относительно того, что на самом деле происходит). Однако это недлиннее дела.