Comments (7)
In this particular case, the fact that the class is NOT a singleton can easily be inferred:
-
the base class is abstract, but defines hashCode()/equals() methods which are final. The designer was clearly thinking about subclassing and defined the equality contract
-
the implementation of equals() performs instanceof checks (as opposed to .getClass() equality check), further reinforcing the fact the class is supposed to be subclassed
from spotbugs.
What heuristics does SpotBugs use to detect singleton classes? After upgrading to the new release, I also get several warnings of this type for classes that are clearly not singletons. For example one class has several factory methods that each return new instances. And there are several package private constructors declared.
Also AFAIK synchronization is not always needed, i. e. if the instance is held in a static field that is unconditionally initialized either at declaration or in a static initializer block.
This rule needs some rework.
from spotbugs.
@rovarga Thank you for the example and your explanation. I proposed a PR fixing this FP.
@xzel23 Yes, you are right about the synchronization. It was a bug in the detector in SpotBugs, which was reported in #2932 and the PR fixing it was already merged to master, so it will be in the next release.
If you could share some (hopefully minimal) examples, that could help identifying the underlying issues.
from spotbugs.
@JuditKnoll Here is an example. Even if you say the error reported by spotbugs is already fixed, the important thing is: this simply is not a singleton class, so none of the singleton rules should apply. This class provides public factory methods to create new instances, this should be detected and the class not be marked as singleton:
package issues.spotbugs;
public class A {
private static final A INSTANCE = new A("1");
private final String text;
private A(String text) {
this.text = text;
}
public static A instance1() {
return INSTANCE;
}
public static A create(String text) {
return new A("text");
}
public String getText() {
return text;
}
}
from spotbugs.
@xzel23 Thank you for your example. The #2951 modifies the logic for identifying Singletons as well, which was indeed not strict enough. Your example (named NotSingletonWithFactoryMethod
in the PR) isn't be considered Singleton in it.
from spotbugs.
Related Issues (20)
- Getting com.intellij.diagnostic.PluginException Randomly in the IntelliJ Plugin HOT 1
- False positive SING_SINGLETON_GETTER_NOT_SYNCHRONIZED with eager instances HOT 2
- False positive SING_SINGLETON_IMPLEMENTS_SERIALIZABLE with readResolve() present HOT 3
- SE_BAD_FIELD with records and spotbugs-4.8.4 HOT 4
- False Positive: IL_INFINITE_LOOP HOT 6
- Prefix matching behavior of SuppressFBWarnings makes it impossible to suppress just one warning HOT 2
- DataflowAnalysisException in 4.7.3 and 4.8.3 HOT 5
- Preview mode for new/enhanced detectors HOT 2
- How to get line number of method in Interface HOT 1
- Spotbugs 4.8.4 release notes missing in GitHub HOT 5
- MC_OVERRIDABLE_METHOD_CALL_IN_READ_OBJECT false positive in 4.8.4 HOT 14
- Test classes for issue 574 are in the wrong package HOT 1
- Failing while building spotbugs version 4.2.3 using ./gradlew build HOT 5
- Change the release process to automate the changelog HOT 1
- False positive SING_SINGLETON_IMPLEMENTS_SERIALIZABLE when class is not a singleton HOT 3
- Still getting NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE with Objects.requireNonNull HOT 1
- Version 4.8.4 false positive SING_SINGLETON_GETTER_NOT_SYNCHRONIZED HOT 6
- False positive BC_IMPOSSIBLE_INSTANCEOF HOT 4
- Stylesheet not working in 4.8.4 HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from spotbugs.