Использование конечной переменной в сигнатуре метода Java SwingWorker - PullRequest
3 голосов
/ 07 сентября 2011
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.Переменная package должна быть объявлена ​​как финальная, иначе компилятор пожалуется, потому что SwingWorker является внутренним классом.Возникают следующие вопросы о том, как и когда я могу присвоить значения этой переменной:

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

Заранее благодарим за помощь.

Эллиот

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

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

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

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

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

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

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

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

1 голос
/ 07 сентября 2011

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

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

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

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

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

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

Вы можете вызывать его много раз.Объявление параметра final не влияет на вызов кода метода (только для его реализации).

1 голос
/ 07 сентября 2011

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

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

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

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

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

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

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

Нет, это совершенно не имеет значения

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

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

1 голос
/ 07 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...