
Inline adoc files when they are included exactly once. Also fix language tags because this inlining gives us better information on what language the code is written in.
69 lines
1.3 KiB
Plaintext
69 lines
1.3 KiB
Plaintext
== Why is this an issue?
|
|
|
|
The purpose of an abstract class is to provide some heritable behaviors while also defining methods which must be implemented by sub-classes.
|
|
|
|
|
|
A class with no abstract methods that was made abstract purely to prevent instantiation should be converted to a concrete class (i.e. remove the ``++abstract++`` keyword) with a private constructor.
|
|
|
|
|
|
A class with only abstract methods and no inheritable behavior should be converted to an interface.
|
|
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,text]
|
|
----
|
|
public abstract class Animal { // Noncompliant; should be an interface
|
|
abstract void move();
|
|
abstract void feed();
|
|
}
|
|
|
|
public abstract class Color { // Noncompliant; should be concrete with a private constructor
|
|
private int red = 0;
|
|
private int green = 0;
|
|
private int blue = 0;
|
|
|
|
public int getRed() {
|
|
return red;
|
|
}
|
|
}
|
|
----
|
|
|
|
|
|
=== Compliant solution
|
|
|
|
[source,text]
|
|
----
|
|
public interface Animal {
|
|
void move();
|
|
void feed();
|
|
}
|
|
|
|
public class Color {
|
|
private int red = 0;
|
|
private int green = 0;
|
|
private int blue = 0;
|
|
|
|
private Color () {}
|
|
|
|
public int getRed() {
|
|
return red;
|
|
}
|
|
}
|
|
|
|
public abstract class Lamp {
|
|
|
|
private boolean switchLamp=false;
|
|
|
|
public abstract void glow();
|
|
|
|
public void flipSwitch() {
|
|
switchLamp = !switchLamp;
|
|
if (switchLamp) {
|
|
glow();
|
|
}
|
|
}
|
|
}
|
|
----
|
|
|