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.
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 } }
public void makeCopies(String[] source) { this.array = Arrays.copyOf(source, source.length); Collections.addAll(this.list, source); }
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; }