== Why is this an issue? Field injection seems like a tidy way to get your classes what they need to do their jobs, but it's really a ``++NullPointerException++`` waiting to happen unless all your class constructors are ``++private++``. That's because any class instances that are constructed by callers, rather than instantiated by a Dependency Injection framework compliant with the JSR-330 (Spring, Guice, ...), won't have the ability to perform the field injection. Instead ``++@Inject++`` should be moved to the constructor and the fields required as constructor parameters. This rule raises an issue when classes with non-``++private++`` constructors (including the default constructor) use field injection. === Noncompliant code example [source,java] ---- class MyComponent { // Anyone can call the default constructor @Inject MyCollaborator collaborator; // Noncompliant public void myBusinessMethod() { collaborator.doSomething(); // this will fail in classes new-ed by a caller } } ---- === Compliant solution [source,java] ---- class MyComponent { private final MyCollaborator collaborator; @Inject public MyComponent(MyCollaborator collaborator) { Assert.notNull(collaborator, "MyCollaborator must not be null!"); this.collaborator = collaborator; } public void myBusinessMethod() { collaborator.doSomething(); } } ---- ifdef::env-github,rspecator-view[] ''' == Implementation Specification (visible only on this page) === Message Use constructor injection for this field. ''' == Comments And Links (visible only on this page) === on 14 Oct 2016, 13:31:17 Freddy Mallet wrote: As decided with the Java team, let's remove this rule from the default "Sonar way" quality profile. See SONARJAVA-1880. endif::env-github,rspecator-view[]