Skip to content
This repository has been archived by the owner on Jan 13, 2023. It is now read-only.

[S90-JAVA] Avoid use of static in interface #183

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/java-plugin/src/main/java/fr/cnumr/java/RulesList.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ public static List<Class<? extends JavaCheck>> getJavaChecks() {
AvoidUsingGlobalVariablesCheck.class,
AvoidSetConstantInBatchUpdate.class,
FreeResourcesOfAutoCloseableInterface.class,
AvoidMultipleIfElseStatement.class
AvoidMultipleIfElseStatement.class,
AvoidUseOfStaticInInterface.class
));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package fr.cnumr.java.checks;

import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
import org.sonar.plugins.java.api.tree.*;

import javax.annotation.Nonnull;
import java.util.Arrays;
import java.util.List;

@Rule(
key = "S90",
name = "Developpement",
description = AvoidUseOfStaticInInterface.MESSAGE_RULE,
priority = Priority.MINOR,
tags = {"bug"})
public class AvoidUseOfStaticInInterface extends IssuableSubscriptionVisitor {

public static final String MESSAGE_RULE = "Avoid use of static in interface.";

private final UseInterfaceVisitor VISITOR = new UseInterfaceVisitor();

@Override
public List<Tree.Kind> nodesToVisit() {
return Arrays.asList(Tree.Kind.INTERFACE);
}

@Override
public void visitNode(@Nonnull Tree tree) {
tree.accept(VISITOR);
}

private class UseInterfaceVisitor extends BaseTreeVisitor {
@Override
public void visitVariable(@Nonnull VariableTree tree) {
if (tree.symbol().isStatic()) {
reportIssue(tree, MESSAGE_RULE);
} else {
super.visitVariable(tree);
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<p>
Avoid use of static in interface. Prefer the use of Enum.
</p>
<h2>Noncompliant Code Example</h2>
<pre>
public interface Color {
public static final int RED = 0xff0000;// Noncompliant
public static final int BLACK = 0x000000;// Noncompliant
public static final int WHITE = 0xffffff;// Noncompliant
}
</pre>
<h2>Compliant Code Example</h2>
<pre>
public enum Color {
RED(0xff0000),// Compliant
BLACK(0x000000),// Compliant
WHITE(0xffffff);// Compliant
}
</pre>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"title": "Avoid use of static in interface.",
"type": "CODE_SMELL",
"status": "ready",
"remediation": {
"func": "Constant\/Issue",
"constantCost": "20min"
},
"tags": [
"eco-conception"
],
"defaultSeverity": "Minor"
}
11 changes: 11 additions & 0 deletions src/java-plugin/src/test/files/AvoidUseOfStaticInInterface.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fr.cnumr.java.utils;

public class AvoidUseOfStaticInInterface {

public interface Color {
public static final int RED = 0xff0000;// Noncompliant
public static final int BLACK = 0x000000;// Noncompliant
public static final int WHITE = 0xffffff;// Noncompliant
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fr.cnumr.java.utils;

public class AvoidUseOfStaticInInterface {

public enum Color {
RED,// Compliant
BLACK,// Compliant
WHITE;// Compliant
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ void checkNumberRules() {
final MyJavaFileCheckRegistrar registrar = new MyJavaFileCheckRegistrar();
registrar.register(context);

assertThat(context.checkClasses()).hasSize(19);
assertThat(context.checkClasses()).hasSize(20);
assertThat(context.testCheckClasses()).isEmpty();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package fr.cnumr.java.checks;

import org.junit.jupiter.api.Test;
import org.sonar.java.checks.verifier.JavaCheckVerifier;

public class AvoidUseOfStaticInInterfaceTest {

@Test
public void checkNonCompliantTests() {
JavaCheckVerifier.newVerifier()
.onFile("src/test/files/AvoidUseOfStaticInInterface.java")
.withCheck(new AvoidUseOfStaticInInterface())
.verifyIssues();
}

@Test
public void checkCompliantTests() {
JavaCheckVerifier.newVerifier()
.onFile("src/test/files/GoodUsageOfEnumInsteadOfInterface.java")
.withCheck(new AvoidUseOfStaticInInterface())
.verifyNoIssues();
}
}