import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; class Container { private static void foo(int p) { } class Class1 { private int privateField1; // Noncompliant {{Remove the "privateField1" field and declare it as a local variable in the relevant methods.}} private static int staticPrivateField; // Noncompliant [[startColumn=24;endLine=+0;endColumn=42]] private int privateField2 = 42; public int publicField; void method1(boolean cond) { if (cond) { privateField1 = 5; } else { this.privateField1 = 42; } foo(privateField1); foo(privateField2); } void method3() { publicField = 42; foo(publicField); } void method4() { staticPrivateField = 4; foo(staticPrivateField); } abstract void method4(); } // field's values are written conditionally class Class2 { private int privateField1; void method1(boolean cond) { if (cond) { privateField1 = 5; } foo(privateField1); } } // not used - OK class Class3 { private int privateField = 42; void method() {} } // used outside the methods - OK class Class4 { private int privateField1 = 5; private int privateField2 = privateField1 + 1; public int publicField = privateField2 + 1; } // not read - Not OK class Class5 { private int privateField; // Noncompliant private void method() { privateField = 5; } } // field's value is read on other instance - ignore class Class6 { private Class6 that = new Class6(); private int privateField1; private int privateField3; private int privateField2; // Noncompliant private void method2(int value) { this.privateField1 = value; foo(that.privateField1); } private void method3() { privateField2 = 3; foo(privateField2); } private void method4(int value) { this.privateField3 = value; foo(new Class6().privateField3); } } // nested class class Class7 { private int privateField; class NestedClass { public void nestedClassMethod() { foo(privateField); } } void method1() { privateField = 1; } } // local class class Class8 { private int privateField; void method1() { class NestedClass { public void nestedClassMethod() { foo(privateField); } } return new NestedClass(); } void method2() { privateField = 5; } } class Class9 { private static int privateField; // no issue. used outside method static { privateField = 42; } } // static field class Class10 { private static int privateField; static void method1() { privateField = 1; } void method2() { foo(Class10.privateField); } } // used in switch-case expression class Class11 { private static final int privateField = 1; void method1() { switch (1) { case privateField: foo(1); break; default: foo(2); break; } } } // lambda FN class Class12 { int privateField = 3; // FN void plop(IntFunction i) { } void test() { privateField = 2; plop(i-> privateField + 1); } } // used in sibling class class Class13 { class A { private int privateField; void method1() { privateField = 1; foo(privateField); } } class B { void method2() { A a = new A(); foo(a.privateField); } } } // used in lambda public class Class15 { private String privateField = "foo"; void method() { foo(i -> bar(i, privateField)); } } class Class16 { private int privateField; // OK void method1() { privateField = 42; method2(); if (privateField) { } } void method2() { privateField = 1; } } } class UsageOfLogger { private static final Logger LOGGER = LoggerFactory.getLogger(UsageOfLogger.class); // Compliant - constants private final int value = 42; // Noncompliant private void runRunRun(Runnable runnable) { try { runnable.run(); } catch (IOException e) { LOGGER.error("boom", e); System.out.println(value); throw new RuntimeException("bye bye", e); } } } class AnnotatedPrivateFields { @javax.inject.Inject private Object injectedService; // Compliant @Deprecated private String deprecated; // Compliant public String doRandomStuff(String s) { injectedService = s; deprecated = injectedService.toString(); return deprecated + injectedService.toString(); } } class Example { @lombok.Getter private int fieldWithGetter; // Compliant private int value = 42; // Noncompliant @AnyAnnotation private int annotatedField; // Compliant private void foo() { fieldWithGetter = 1; value = 2; } }