Использование переменной final в сигнатуре метода Java SwingWorker

I have a method that uses a SwingWorker.   Part of the code is shown below:

   public class mySocket {

   public void writePacket(final String packet) {
    // schedules execution on the single thread of the executor (so only one
    // background operation can happen at once)
    //
    executor.execute(new SwingWorker<String, Void>() {

        @Override
        protected String doInBackground() throws Exception {
            // called on a background thread
            System.out.println("writing out this packet->" + packet + " 
                            <-");
            out.println(packet);
            String thePacket = readPacket();
            return thePacket;
        }

                ..................

Мои вопросы касаются подписи метода writePacket. Переменная packet должна быть объявлена ​​как final, иначе компилятор выдаст ошибку, поскольку SwingWorker является внутренним классом. Это поднимает следующие вопросы о том, как и когда я могу присвоить значения этой переменной:

  1. Final для меня означает, что переменной можно присвоить значение только один раз. Но поскольку объявление является частью сигнатуры метода, я не знаю, что это означает в данном контексте.
  2. Я всегда предполагал, что переменным final были присвоены значения при создании экземпляра класса, но здесь они присваиваются при вызове метода. Должна ли переменная, переданная методу, также быть объявлена ​​окончательной и назначена в конструкторе класса, чтобы это работало?
  3. Могу ли я вызвать метод более одного раза с разными значениями для пакета или из-за того, что переменная объявлена ​​​​final, означает ли это, что если я хочу вызвать метод с разными значениями, мне нужно повторно создавать класс для каждого нового значения переменной < B> пакет?

Заранее спасибо за помощь.

Эллиотт


person Elliott    schedule 07.09.2011    source источник
comment
пожалуйста, прочитайте stackoverflow.com/questions/7053865/ , ... чтобы избежать потерянных ошибок из SwingWorker & Future‹?›, особенно сообщение @trashgod   -  person mKorbel    schedule 07.09.2011


Ответы (4)


1. Final для меня означает, что переменной можно присвоить значение только один раз. Но поскольку объявление является частью сигнатуры метода, я не знаю, что это означает в данном контексте.

Это просто означает, что вы не можете переназначить новое значение переменной packet.

2. Я всегда предполагал, что переменным final были присвоены значения при создании экземпляра класса, но здесь они присваиваются при вызове метода. Должна ли переменная, переданная методу, также быть объявлена ​​как final и назначена в конструкторе класса, чтобы это работало?

У вас также могут быть переменные local final. Применяются те же правила, но они не связаны со ссылкой на конструктор / this.

3. Могу ли я вызвать метод более одного раза с разными значениями для пакета или потому, что переменная объявлена ​​​​final, означает ли это, что если я хочу вызвать метод с разными значениями, мне нужно повторно создать класс для каждого нового значения переменной пакета ?

Вы можете вызывать метод несколько раз с разными значениями. Переменная packet похожа на локальную переменную. и Нет, вам не нужно повторно создавать класс для каждого значения/вызова.

Дальнейшее чтение SO:

person aioobe    schedule 07.09.2011

Внутренний класс может ссылаться только на конечные переменные, потому что требуемая переменная фактически передается внутреннему классу ctor в качестве параметра. Если бы переменная не была окончательной и изменилась после создания внутреннего класса, она больше не удерживала бы текущую, а предыдущую переменную. Во избежание подобных странностей и для простоты переменные/параметры должны быть окончательными для чтения внутренним классом.

person mP.    schedule 07.09.2011

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

Это означает то же самое, вы не можете переназначить переменную.

// this compiles
public void foo(String bar){
   bar = "xyz";
}

// this doesn't
public void foo(final String bar){
   bar = "xyz";
}

Я всегда предполагал, что переменным final были присвоены значения при создании экземпляра класса, но здесь они присваиваются при вызове метода.

Нет, локальные переменные тоже могут быть final, и параметры тоже. Они назначаются один раз для каждой области (уровень блока или метода).

Должна ли переменная, переданная методу, также быть объявлена ​​окончательной и назначена в конструкторе класса, чтобы это работало?

Нет, это совершенно неважно

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

Нет, см. выше. Это новая переменная для каждого вызова метода.

person Sean Patrick Floyd    schedule 07.09.2011

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

То же самое. Это означает, что вы не можете повторно присвоить новое значение локальной переменной, содержащей параметр (в любом случае это считается плохой практикой).

Я всегда предполагал, что конечным переменным присваивались значения при создании экземпляра класса, но здесь они присваиваются при вызове метода.

Эта первая часть верна для конечных переменных экземпляра, а не для локальных переменных.

Но идея та же: им нужно присвоить значение, и это может произойти только один раз.

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

Вы можете вызывать его много раз. Параметр, объявленный окончательным, не влияет на вызов кода метода (только на его реализацию).

person Thilo    schedule 07.09.2011