2013-12-18 2 views
4

я получаю эту ошибку при запуске Checkstyle на моем коде следующих строк:Возвращение ссылки на изменяемые стоимости объекта, хранящихся в одном из полого объекта обнажает внутреннее представление объекта

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

но ОПИСАНИЕ IS NOT изменяемый. Он определяется как:

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"; 
    } 
} 

Это полное сообщение об ошибке:

"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." 

Связанные Вопрос: Link

+0

Элементы внутри ОПИСАНИЯ изменчивы. – bmargulies

ответ

5

Массивы и некоторые коллекции не являются неизменяемыми в том смысле, что их содержание по-прежнему остается изменчивым.

Неизменность в Java относится только к ссылочному назначению объекта, а не к его глубокому содержанию.

Попробуйте это:

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

Кстати, предостережение для Java именовании ..: descriptions, не DESCRIPTIONS

+1

@Sotirios Delimanolis Да, неизменяемые коллекции не должны беспокоиться об этом виде изменчивости. – Mik378

+0

Это соглашение об именах, которое моя команда следует (ОЧЕНЬ СТРОГО). Спасибо за быстрое объяснение и возможное решение. – user1071840

+0

@ user1071840 Очень странное соглашение;) Добро пожаловать. – Mik378

1

Ссылка переменная final так что вы не можете назначить другой массив DESCRIPTIONS. Однако сам объект является изменяемым (массивы всегда изменяемы), final или нет. Если вы вернете ссылку, вы потеряете контроль над содержимым вашей переменной, нарушив инкапсуляцию.

Вам потребуется либо вернуть копию массива, либо не возвращать массив вообще, предоставляя метод для получения определенного элемента массива, если это достаточно хорошо.

+0

Получил это. Спасибо. – user1071840

Смежные вопросы