Я нашел здесь сообщение в qaru.site/info/427015/..., в котором обсуждается изменение кода, необходимое для предотвращения записи в статическое поле из метода экземпляра, но почему это не очень хорошая практика. так? Почему дизайнеры Java допускают это тогда? Другими словами, почему компилятор не выдает ошибку, когда кто-то пытается это сделать?
Почему это нехорошо писать в статическое поле из метода экземпляра в Java?
Ответ 1
В словах документации findbugz:
Этот метод экземпляра записывает в статическое поле. Это сложно сделать правильно, если манипулировать несколькими экземплярами и, как правило, плохой практикой.
То есть, это не всегда неправильно, просто, что это то, что часто является источником ошибок. Объекты экземпляра, управляющие статическими полями, могут быть полезны, например, для ленивой инициализации общих объектов, поэтому он не всегда ошибочен, но может быть трудно получить его право (особенно если несколько потоков могут работать одновременно).
Ответ 2
В дополнение к вышесказанному, с точки зрения документации, для кого-то легко предположить, что это поле экземпляра, если вы используете форму:
someField = null
или
myObj.someField = null
Используя форму
myClass.someField = null
делает его более ясным и предотвращает предупреждение findbugz (видимо, я не тестировал). Обратите внимание, что это не будет препятствовать описанным многопоточным проблемам.
Ответ 3
Это может быть полезно, например, если у вас есть приложение, которое управляет муравьями, и вы должны иметь возможность получить общее количество созданных муравьев из класса ant. Это можно сделать, записав статический метод, который отслеживает общее количество муравьев каждый раз, когда вы создаете новую запись ant для статического метода addAnt();