= new ArrayList<>();
{
list.add(1);
list.add(2);
}
public Integer setFinalList (final List<Integer> list) {
list.remove(0);
return this.list.get(0);
}
}
setFinalList вернёт 2, нужен 1. Как сделать так чтобы List или будь то HashMap, Set не менялось внутри метода?
Не понял вопроса 😊
Не вызывать изменяющих методов, i.e. не делать remove?
😁 и всё-таки что-то типо final можно сделать в этих случаях?
То что вам нужно. Это неизменяемые коллекции.
А, тебе immutable list нужен. В Collections.unmodifiableList() заверни либо делай копию и передавай ее. Зачем стетом инстанса путаешь, если вопрос исключительно в аргументе?
Юзать персистентные коллекции?
не выход мне нужно изменяемая коллекция (или другой mutable класс) но нужен способ из них делать immutable внутри какого-нибудь метода допустим кто-то обрабатывает list, обращаясь к нему через параметр метода мне нужно по параметру сразу как-то определить будет он менятся в методе или нет, а не анализировать весь код метода.
Что значит, делать immutable внутри метода?
что-то вроде public void someMethod(immutable List<Integer> list) {...} работаешь с классом mutable, кто-то использует его в виде параметра нужно лезть в код этого метода и проверять что он там не изменяется.
Кто не изменяется? Постановку задачи не понимаю 🤨
Зачем лезть в immutable объект и проверять что оно не изменилось?
элементарно работаешь с ArrayList, нужно быренко глянуть где он меняется а где нет из кучи методов где он вызывается, если бы там был такой модификатор как immutable то меньше кода анализировать
Ты своему коду не доверяешь, что кто-то где-то твою коллекцию испортит? Тогда заверни в неизменяемый и передай в метод
ну все работают в команде и проверять чужой код потеря времени, чтобы убидиться что там твой лист только читают.
А все просто, есть srp, меняться должно в одном месте(тот кто и владеет)
Что то похоже на то, как будто нужно навесить ивент на событие
Или возвращать копию коллекции
Короче такого в джаве нет
А в котлине если не изменяет память отдельные интерфейсы есть изменяемые/неизменяемая коллекция
😀да точно нет
1) код-ревью не потеря времени 2) ты уж определись, или надо использовать иммутабельные коллекции, или они могут быть модифицированы в любом месте кода
Вначале они не делают код ревью, а потом у них иммутабельные коллекции могут быть модифицированы а любом месте кода
Так ты это и делаешь через unmodifiableX. А через consumer.pass(new ArrayList<>(source)) ты ничего не делаешь, в том числе не отдаешь исходный объект
причем тут консьюмер, метода pass у консьюмера нет. Единственный вариант похоже это отдавать в метод копию объекта было бы конечно замечательно если был модификатор параметра (метода или класса делающий это сам).
Уважаемый, тут проблема не в написании, а а чтении (понимании абстракций)
Было б вообще не замечательно, потому что с pass-by-value, где value является референс, семантика такого поведения или ни хера не полезная, или ни хера не понятная
а причем тут копия объекта и pass-by-value?
public class MyObject { List<Integer> mutableField = new ArrayList<>(); } Вот есть у тебя такой объект. Если ты копию этого объекта передаешь в другой метод, что у него будет внутри - ссылка на тот же лист? Или лист тоже копировать надо?
имеется ввиду полный клон, конечно это будет жрать память.
- Передавать в метод неизменяемую коллекцию. - Установить в качестве параметра метода List<? extends Integer> list В этот список больше ничего нельзя добавлять, изменять данные можно.
list.add(null) всё ещё будет работать. Ну и unchecked cast никто не отменял.
да, спасибо за то что исправил.
Cpp developer detected Нет, const параметров в джаву ещё не завезли, хотя в котлине кто-то что-то про это говорил, кажется, в контексте нейтива
Обсуждают сегодня