rspec/rules/S6220/java/rule.adoc

63 lines
1.5 KiB
Plaintext
Raw Normal View History

== Why is this an issue?
2021-04-28 16:49:39 +02:00
Java 15 introduced feature of ``++sealed++`` classes. With ``++sealed++`` classes and interfaces you can specify a strict hierarchy of types and restrict possible inheritance.
Although this feature can help to make code safer, it is not applicable everywhere. Functional interfaces can not be sealed. This means that if an interface with a single abstract method is declared with a ``++sealed++`` keyword, its implementation can't be replaced with a lambda.
This rule reports an issue when an interface with a single abstract method is marked ``++sealed++``.
=== Noncompliant code example
2021-04-28 16:49:39 +02:00
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
public sealed interface F permits ... { // Noncompliant
void f();
}
----
=== Compliant solution
2021-04-28 16:49:39 +02:00
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
public interface F { // Compliant
void f();
}
----
== Resources
2021-04-28 16:49:39 +02:00
* https://docs.oracle.com/javase/specs/jls/se16/preview/specs/sealed-classes-jls.html#jls-8.1.1.2[Sealed classes specification]
ifdef::env-github,rspecator-view[]
'''
== Implementation Specification
(visible only on this page)
=== Message
Remove this "sealed" keyword if this interface is supposed to be functional
=== Highlighting
interface declaration
'''
== Comments And Links
(visible only on this page)
=== on 22 June 2021, 15:53:00 Alban Auzeill wrote:
For the `java` analyzer we decided to not implement this rule,
see why on https://github.com/SonarSource/sonar-java/pull/3658[*this github PR*]
and https://jira.sonarsource.com/browse/[SONARJAVA-3775]
endif::env-github,rspecator-view[]