Product: SonarQube Community (self-hosted)
sonar-java version: sonar-java 8.28.0.43176 on SonarQube Community Build 26.4.0.121862
Java source level: 21 (javac 21, source/target 17)
Rule
java:S3985 — “Unused private classes should be removed”
Description
S3985 inconsistently handles Jackson-based usages of private nested types: enums referenced via @JsonCreator are recognized as used, while equivalent usage through @JsonValue is incorrectly reported as unused.
Reproducer
package demo;
import java.util.Locale;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
public class JsonValueExample {
private JsonValueExample() {}
// Not flagged — @JsonCreator is recognized as a framework usage.
private enum FooBarOk {
FOO, BAR;
@JsonCreator
static FooBarOk of(String value) {
return valueOf(value.toUpperCase(Locale.ROOT));
}
}
// Flagged by S3985 as "unused private class", even though @JsonValue
// makes this enum reachable from {NAME} exactly like the one above.
private enum FooBarBad {
FOO, BAR;
@JsonValue
String value() {
return name().toLowerCase(Locale.ROOT);
}
}
}