rspec/rules/S3012/java/rule.adoc

52 lines
1.4 KiB
Plaintext
Raw Normal View History

2021-04-28 16:49:39 +02:00
Using a loop to copy an array or a subset of an array is simply wasted code when there are built-in functions to do it for you. Instead, use ``++Arrays.copyOf++`` to copy an entire array into another array, use ``++System.arraycopy++`` to copy only a subset of an array into another array, and use ``++Arrays.asList++`` to feed the constructor of a new list with an array.
Note that ``++Arrays.asList++`` simply puts a ``++Collections++`` wrapper around the original array, so further steps are required if a non-fixed-size ``++List++`` is desired.
2021-04-28 16:49:39 +02:00
== Noncompliant Code Example
----
public void makeCopies(String[] source) {
this.array = new String[source.length];
this.list = new ArrayList(source.length);
for (int i = 0; i < source.length; i++) {
this.array[i] = source[i]; // Noncompliant
}
for (String s : source) {
this.list.add(s); // Noncompliant
}
}
----
2021-04-28 16:49:39 +02:00
== Compliant Solution
----
public void makeCopies(String[] source) {
this.array = Arrays.copyOf(source, source.length);
Collections.addAll(this.list, source);
}
----
2021-04-28 16:49:39 +02:00
== Exceptions
Rule detects only the most idiomatic patterns, it will not consider loops with non-trivial control flow. For example, array elements that are copied conditionally are ignored.
----
public int[] getCopy(int[] source) {
int[] dest = new int[source.length];
for (int i = 0; i < source.length; i++) {
if (source[i] > 10) {
dest[i] = source[i]; // Compliant
}
}
return dest;
}
----