[Java] вопрос по языку

Sanjaz



public class MyArray
{
private double[] array;
...
public double[] getArray
{ return array; }
}


Вопрос: как сделать так, чтоб метод getArray возвращал констанный массив? Т.е. элементы массива нельзя было бы изменять.

bleyman

Че-то типа return array.clone или как оно там называеццо. Иначе никак, афаик.

ifani

Запихни это всё в ArrayList )

bleyman

А че, типа, поможет?

ifani

Точнее:
1. Если просто не хочешь, чтобы изменились данные, то создавай новый массив и его передавай
2. Как вариант, запихнуть значения в Double, а потом их - в ArrayList. Уже Double никто поменять не сможет.
3. Тоже, что и в пункте 2, плюс сделать Collections.unmodifiableList(ArrayList) и отдать результат - теперь его, точно, никто не поменяет%) (так как во втором варианте значение можно было заместить)

Sanjaz

Пасибо бальшое

ifani

Ботаешь?

voronetskaya

Уже Double никто поменять не сможет
чего-о?

bastii

можно еще вместо
double[] getArray;
сделать
int getArraySize;
double getArrayItem(int i);
тоже иногда вариант
просто создавать каждый раз новый объект неизменяемого списка не всегда хорошо

ifani

А что, сможешь у Double найти set-метод? %

voronetskaya

нет, зато смогу со второго раза заметить эту фразу -
так как во втором варианте значение можно было заместить

все равно катит тока третий вариант

ifani

Имхо, это самый лучший вариант в большинстве случаев, но просто он просил вернуть массив

Sanjaz

А мне больше понравился вариант с array.clone

bastii

тогда можно попробывать реализовать в самом классе интерфейс List или закэшировать врапер

ifani

в разных случаях по-разному
У меня вот сейчас схожая проблема:
Есть SynchronizedHashMap - нужно пробежаться по её значениям и отобрать те из них, которые удовлетворяют критерию.
Проблема в том, что в это время в этой Мар'е могут меняться и ключи, и значения (либо явно другим потоком, либо самой JVM).
Как быть? Очевидное решение synchronized(SynchronizedHashMap){...} не предлагать - не подходит

ifani

Я думаю сначала получить итератор по ключам (то есть во время поиска не учитывать появление новых ключей) и потом пробежаться по ним, типа:
Iterator keys=cache.keySet.iterator;
Но если набор ключей изменится, то я боюсь, что итератор кинет исключение одновременной модификации
Есть ещё варианты быстрого перебора ключей?

Hastya

см. java.util.concurrent.ConcurrentHashMap

ifani

это в Java 5 что ли?
в 1.4.2 такого нет

ifani

стопудей в пятой
Мне нельзя - я сертификацию пишу
А там можно использовать только ждк, со дня официального релиза которого прошло более 18 месяцев...

Hastya

клонировать и просмотреть keySet
Оставить комментарий
Имя или ник:
Комментарий: