Странное поведение лямбды

tox1cozZ

aka Agravaine
8,456
598
2,893
Имеется такой код, который при нажатии на пкм запускает шедулер и через время должно выполнится действие с стаком:
Java:
@Override
public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player){
    Scheduler.server().schedule(() -> ItemGun.setAttachSilencer(item, true), 67);      
}
Если я в лямбду передаю аргумент item метода - нифига не пашет и он как будто бы передает копию, а не оригинальный объект:
() -> ItemGun.setAttachSilencer(item, true)
Если же передаю туда player.getCurrentEquippedItem() - все работает нормально.

В чем прикол? Впервые сталкиваюсь с таким, тапками не кидайте)
 
4,046
63
645
Скорее всего передавать нужно какой-нибудь "постоянный" объект. Попробуй сохрани айтем где-нибудь и бери его оттуда.
Просто когда время подходит, возможно, айтема уже нет. Метод же как бы уже выполнен.
 
7,099
324
1,510
Он по идее и без того сохранится в замыкании. Но если это мутабл-объект, то может успеть испортиться. Попробуй сделать копию стака и работать с ней
Java:
public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player){
    ItemStack item1=item.copy();// ide  не открыта, не помню, как точно копировать стак
    Scheduler.server().schedule(() -> ItemGun.setAttachSilencer(item1, true), 67);     
}
 
7,099
324
1,510
Тогда юзай player.getCurrentEquippedItem(), потому что стак из параметра видимо копируется перед передачей в параметры
 
2,505
81
397
А ты уверен, что за это время стак не меняется? Может ты текущий стак прокручиваешь в руке туда-сюда. Или какая-нибудь синхронизация происходит.
 
7,099
324
1,510
Прикол в том, что без лямбды пашет со стаком из аргументов
Без лямбды, всм, прямо на месте сделать?
Значит за время пока ждешь - стак в руке другой становится
 
Сверху