Как изменить значение локальной переменной внутри внутреннего класса?

Я только что узнал, что я не могу использовать не конечную локальную переменную внутри анонимного внутреннего класса, поэтому есть ли какой-нибудь сложный способ, когда нам нужно изменять значения внутри внутренних классов без объявления мгновенных переменных?

Вы не можете использовать их по уважительной причине, которые вам необходимо рассмотреть перед продолжением. Что конкретно вы будете делать с экземпляром анонимного класса? Если он потребляется только локально, в рамках этого метода, вы можете использовать этот простой трюк (допустим, у вас есть int var):

 final int localVar[] = {1}; new AnonymousClass() { public void method() { localVar[0]++; } }; 

Если экземпляр будет доступен после того, как метод, который создал его, вернется, вы можете столкнуться с проблемами безопасности потоков. Экземпляр может быть передан другим потокам, а простой дизайн выше не является потокобезопасным.

Вы можете написать свой собственный простой Holder .

 /** * Make a final one of these to hold non-final things in. */ public class Holder <T> { private T held = null; public Holder () { } public Holder (T it) { held = it; } public void hold(T it) { held = it; } public T held() { return held; } @Override public String toString () { return String.valueOf(held); } } 

Пожалуйста, не используйте атомы – у них есть значительные накладные расходы.

 final Holder<Integer> number = new Holder(0); ... { number.hold(n); } ... return number.held(); 

Вы можете использовать этот фрагмент.

 void someMethod(){ final AtomicReference<String> var = new AtomicReference<String>("Blah") foo(new Bar(){ void baz(){ var.set("Blah-blah"); } }); } 
Intereting Posts