Я писал этот фрагмент кода, чтобы понять отражение, и столкнулся с одним сценарием, в котором я не мог понять причину поведения кода. Надеюсь, я получу рекомендации от сообщества. Ниже приведен мой класс тестовой модели, и здесь для каждого экземпляра я хочу знать точное количество экземпляров, созданных во время выполнения (с использованием отражения)
public final class Model {
private static final Model instance = new Model("Testing");
private static int count = 0;
private String name;
private Model(String name) {
this.name = name;
++count;
}
public static Model getInstance() {
return instance;
}
public static int getInstanceCount() {
return count;
}
public String getName() {
return name;
}
public void doSomething() {
try {
System.out.println("Shh.... I am trying to do something");
Thread.sleep(1000);
System.out.println("Ok! Done.");
return;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Oops! I failed in doing your job...");
}
}
Код драйвера для этого сценария выглядит следующим образом:
public class ReflectionTest {
public static void main(String[] args) throws Exception {
Model.getInstance().doSomething();
System.out.println(Model.getInstanceCount());
Constructor<?>[] constructor = Model.class.getDeclaredConstructors();
for (Constructor<?> aConstructor : constructor) {
aConstructor.setAccessible(true);
Model m = (Model) aConstructor.newInstance("Testing through Reflection");
System.out.println(m.getName());
m.doSomething();
System.out.println(m.getInstanceCount());
//System.out.println(Model.getInstanceCount());
}
}
}
Результат для этого фрагмента кода был следующим:
Shh.... I am trying to do something
Ok! Done.
0
Testing through Reflection
Shh.... I am trying to do something
Ok! Done.
1
Как вы можете видеть, количество экземпляров оказалось равным 1. Я ожидал, что это будет как 2. Однако я изменил конструктор класса тестовой модели, как показано ниже. Тип данных count теперь изменен на Integer вместо ранее установленного int .
private Model(String name) {
this.name = name;
if (count == null)
count = 0;
++count;
}
Удивительно, но я получаю правильное значение для количества экземпляров.
Shh.... I am trying to do something
Ok! Done.
1
Testing through Reflection
Shh.... I am trying to do something
Ok! Done.
2
Это может быть глупый вопрос, но я не могу понять, что на самом деле произошло за кулисами. Мне нужны рекомендации сообщества по этому поводу. Заранее спасибо.