передать значение по окончательному параметру - PullRequest
2 голосов
/ 15 марта 2012

У нас есть метод, параметр которого определен как final, а затем измените значение этого параметра (в этом методе) и верните его, его не следует изменять, поскольку мы передали его как final. Но это не так.

Пожалуйста, помогите мне понять это!

public static void main(String[] args) {
        EmployeeBean e1 = new EmployeeBean("1", "jitu");
System.out.println("object before set >>" + e1.getEmpName());

EmployeeBean newObj = x.changeFinalvalue(e1);
        System.out.println("object after set >>" + newObj.getEmpName());


public EmployeeBean changeFinalvalue(final EmployeeBean x) {
        x.setEmpName("Jeet");
        return x;
    }

Выход: объект после множества >> jitu

объект после набора >> Джит // сомнение: это должен быть только 'jitu'

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Вы не изменяете, на какой объект ссылается параметр (что здесь не разрешено). Вместо этого вы изменяете состояние объекта (которое здесь разрешено).

Другими словами, когда вы передаете свой объект e1 EmployeeBean в метод, параметр x ссылается на тот же объект, на который ссылается e1, и внутри метода это не может измениться, и поэтому вы не можете сделать это:

public EmployeeBean changeFinalvalue(final EmployeeBean x) {
  x = new EmployeeBean(); // changing the reference is not allowed!
  return x;
}

Но то, что вы делаете - изменение состояния объекта - разрешено.

Единственный известный мне способ предотвращения подобных проблем - сделать глубокую копию объекта, переданного в качестве параметра, и работать с объектом copy / clone. Вы также можете сделать EmployeeBean неизменным, но тогда это не будет большой частью Боба, не так ли?

Редактировать: Я подумал, что этот вопрос должен был быть задан здесь много раз, и после небольшого поиска я обнаружил, что, конечно, так и есть. Пожалуйста, посмотрите на эти ссылки для хорошего обсуждения этого. Обратите внимание, что это общая проблема конечных переменных, будь то параметры метода или поля класса:
Java-финал-ключевое слово-для-переменных
Java-окончательный модификатор

1 голос
/ 15 марта 2012

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

То же самое верно для всех других конечных переменных.

0 голосов
/ 15 марта 2012

Ключевое слово final в части объявления параметров метода означает, что вы не можете переназначить его внутри метода (скажем, x = new EmployeeBean();).Но ясно, что вы можете изменить его атрибуты, и поскольку метод получает ссылку на объект, любые изменения, внесенные вами в состояние объекта внутри метода, будут преобладать после того, как метод вернется к своему вызывающему объекту.

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

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