它是一种混叠形式,可能是反直觉的.反直觉代码阻碍了维护的便利.
逻辑上,我们期望实例方法影响该实例的数据.我们期望静态方法影响静态数据.
我们重命名doSomething来初始化:
...
a.initialize();
...
b.initialize();
...
该代码的读者可能不会立即意识到a和b的实例实际上影响相同的数据.这可能是一个错误,因为我们初始化相同的内存两次,但它是不明显的,因为我们可能需要调用每个实例的初始化似乎是合理的.
但代码是:
...
MyClass.initialize();
...
MyClass.initialize();
...
在这种情况下,它更直观,我们可能会影响相同的静态数据,这可能是一个错误.
这类似于通用版本的别名,其中同一范围内的两个变量指向相同的实例.
对于你的最后一个例子,
>一个实例调用静态方法
事实上,一个实例方法调用一个静态方法不会引起标志.这个例子是有用的远远超过它可能是一个问题.
>一个类的静态方法会影响另一个类的静态数据
在某种意义上,它应该产生一个不同的但类似的警告:一个类正在混乱另一个类的数据.然而,通过使静态变量public成为默认的方式,因此不需要这样的警告.
请记住,FindBugs只是在您的代码中标记潜在的可能问题,而不是每个可能的问题.您的第一个例子可能是一个潜在的维护问题,您需要检查它是否是真正的问题.你的第二个例子可能不是问题,或者是一个真正的问题,与使用不是问题的情况非常相似.