2015-10-09 2 views
2

Рассмотрим этот классКак избежать использования .clone()?

class MyClass { 
    private MyData[] data; 

    public MyData[] getData() { 
    return data == null ? null : (MyData[]) data.clone(); 
    } 

Это создает Issue

Security - Метод возвращает внутренний массив

обнажая внутренние массивы непосредственно позволяет пользователю изменять код , который может иметь решающее значение. Безопаснее возвращать копию массива.

Учитывая, что clone является плохим и его следует избегать, что я могу сделать, чтобы сделать этот код лучше?

+6

просто скопируйте массив? – Paul

+0

'System.arraycopy' или' Arrays.copyOf' оба могут делать то, что вы хотите. –

+0

что вы пытаетесь достичь здесь? массив только для чтения? иначе просто вернуть данные сами по себе. – WalterM

ответ

6

Самый простой способ вернуть копию массива, вероятно, будет по телефону Arrays.copyOf:

public MyData[] getData() { 
    return data == null ? null : Arrays.copyOf(data, data.length); 
} 
+0

Предпочитаете 'System.arraycopy'. (Upvote) –

+1

@ sᴜʀᴇsʜᴀᴛᴛᴀ' Arrays # copyOf' использует 'System.arraycopy' позади сцены, и это легче позвонить/понять. –

2

Я тоже согласен, что клон это плохо, но не на массивах. Клон хорошо работает в массиве. Ваш код чист. Сохраните его, как есть.

Вскоре я приложу ссылку на слова Джоша Блоха на клонирование массива.

Josh Bloch on Cloning

Doug Lea идет еще дальше. Он сказал мне, что больше не использует клон, кроме как копировать массивы. Вы должны использовать клон для копирования массивов, потому что это самый быстрый способ сделать это. Но типы Дуга просто не реализуют Cloneable. Он отказался от этого. И я думаю, что это неразумно.

Если вы полностью избежать клонирования, следующий лучшим вариантом является

System.arraycopy(array1,0, array2, 0, array1.length); 

потому

Arrays.copyOf создает другой объект массива внутри и возвращает его там, где, как System.arraycopy использует переданный массив.

+2

Я бы уничтожил любой код, который использует '.clone' и заменит его на правильный код. –

+0

прочтите обновление пожалуйста. – daydreamer

+0

@LuiggiMendoza Хм .. Я вижу вашу точку зрения. Согласовано. –

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