Это форма псевдонима, которая может быть нелогичной. Неинтуитивный код мешает простоте обслуживания.
Логически мы ожидаем, что методы экземпляра будут влиять на данные этого экземпляра. Мы ожидаем, что статические методы влияют на статические данные.
Давайте переименуем doSomething
в initialize
:
...
a.initialize();
...
b.initialize();
...
Читатель этого кода может не сразу понять, что экземпляры a
и b
фактически влияют на одни и те же данные. Это может быть ошибкой, поскольку мы инициализируем одну и ту же память дважды, но это неочевидно, поскольку кажется разумным, что нам может потребоваться вызывать initialize
в каждом экземпляре.
Однако код был:
...
MyClass.initialize();
...
MyClass.initialize();
...
В этом случае более интуитивно понятно, что мы, вероятно, влияем на одни и те же статические данные, и это, скорее всего, ошибка.
Это похоже на обычную версию псевдонимов, где две переменные в одной области видимости указывают на один и тот же экземпляр.
Для вашего последнего примера,
экземпляр вызывает статический метод
Тот факт, что метод экземпляра вызывает статический метод, не должен вызывать флаги. Примеры, в которых это полезно, значительно перевешивают, где, вероятно, проблема.
статический метод одного класса влияет на статические данные другого класса
В каком-то смысле это должно сгенерировать другое, но похожее предупреждение: один класс связывается с данными другого класса. Однако, сделав статическую переменную общедоступной, это способ молчаливого утверждения этого, поэтому такое предупреждение не требуется.
Имейте в виду, что FindBugs просто пытается пометить потенциальные проблемы, а не все возможные проблемы, в вашем коде. Ваш первый пример, вероятно, является потенциальной проблемой обслуживания, которую вам нужно проверить, является ли это реальной проблемой. Ваш второй пример, скорее всего, не проблема, или это реальная проблема, которая слишком похожа на случаи использования, когда не проблема.