2015-09-04 2 views
0

Могут ли нефинализированные аргументы или возвращенные объекты изменять объект?неизменяемые конечные аргументы и возвращаемые значения

Что разница, изменив следующим образом:

public final class MyImmutableClass { 

public final MyObject doStuff(final SomeObject someObject) { 
    ... 
} 

} 

к этому:

public final class MyImmutableClass { 

public MyObject doStuff(SomeObject someObject) { 
    ... 
} 

} 

Когда цель состоит в том, чтобы сделать MyImmutableClass действительно неизменен.

После внесения изменений, MyImmutableClass по-прежнему считается неизменным? Если нет, то какое состояние можно было бы изменить путем внесения изменений?

+2

IIRC делает класс окончательным не влияет на переменчивость. Это просто означает, что класс не может быть подклассифицирован –

+1

Возможный дубликат http://stackoverflow.com/questions/2236599/final-keyword-in-method-parameters? – Sweeper

ответ

3

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

public final MyObject doStuff(final SomeObject someObject) {

Здесь, вы не можете изменить ссылку someObject, чтобы указать на какой-либо другой экземпляр SomeObject внутри метода. Это гарантирует, что вы всегда используете аргумент, переданный вызывающим.

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

Смежные вопросы