I'm getting this error when running checkstyle on my code for the following lines:

@Override
public String[] getDescriptions() {
    return DESCRIPTIONS;
}

but DESCRIPTIONS IS NOT mutable. It's defined as:

private static final String[] DESCRIPTIONS = new String[NUM_COLUMNS];

static {
   // In a loop assign values to the array.
   for (int i = 0; i < NUM_COLUMNS; ++i) {
       DESCRIPTIONS[i] = "Some value";
   }
}

This is the complete error message:

"Returning a reference to a mutable object value stored in one 
 of the object's fields exposes the internal representation of
 the object. If instances are accessed by untrusted code, and 
 unchecked changes to the mutable object would compromise security
 or other important properties, you will need to do something 
 different. Returning a new copy of the object is better approach
 in many situations."

Related Question: Link

2

There are 2 answers

7
Mik378 On BEST ANSWER

Arrays and some collections are not immutable in the sense that their content still remains mutable.

Immutability in Java only concerns object's reference assignment, not its deep content.

Try this:

@Override
public String[] getDescriptions() {
    return Arrays.copyOf(DESCRIPTIONS, DESCRIPTIONS.length);
}

BTW, caution to java naming convention.. : descriptions, not DESCRIPTIONS

0
rgettman On

The reference variable is final so you cannot assign another array to DESCRIPTIONS. However, the object itself is mutable (arrays are always mutable), final or not. If you return the reference, then you lose control over the contents your variable, violating encapsulation.

You would need either to return a copy of the array, or don't return the array at all, providing a method to get a specific element of the array instead, if that's good enough.