Использовать нужно свойства. При чем оставить только на чтение. В зависимости от языка, массив - это либо указатель, либо набор данных. Так что на твой вопрос абстрактно нельзя ответить.
Например Delphi:
type
MyObject = class
private
FMyArray: array of string;
public
property Strings: array of string read FMyArray;
end;
Так мы ничего не теряем, но запрещаем изменять ссылку на массив. Хотя, сам массив ни кто тебе не запрещает изменять, если на него есть ссылка, но это уже проблемы указателей и отдельного языка.
Для того, чтоб нельзя было вообще что-то делать с массивом, можно использовать следующую конструкцию:
type
MyObject = class
private
FMyArray: array of string;
function GetMyArrayItem(Index: integer): string;
public
property Strings[Index: integer]: string read GetMyArrayItem;
end;
В таком случае, ссылки на массив нет. И изменить данные массива нельзя.