2014-01-07 1 views
1

Я работаю над разрешением предупреждений Checkstyle в проекте Java.Стиль проверки Java: конечное назначение переменной задания параметра

Пусть это метод я есть:

public SomeObject someObjectBehavior(SomeObject oldSomeObject, 
    SomeObject newSomeObject) { 

    if(oldSomeObject == null) { 
     oldSomeObject = newSomeObject; 
    } 
} 

Когда я включить Checkstyle, он уведомляет

Параметр oldSomeObject должно быть окончательным

Параметр newSomeObject должно быть окончательным

Когда я конвертирую оба параграфа метров, как это:

public SomeObject someObjectBehavior(final SomeObject oldSomeObject, 
    final SomeObject newSomeObject) { 

    if(oldSomeObject == null) { 
     oldSomeObject = newSomeObject; //Assignment operation 
    } 
} 

Итак, теперь операция присваивания не представляется возможным, есть ошибка в Java коде

Конечное локальная переменная oldSomeObject не может быть назначена. Он должен быть пустым и не использовать составное назначение.

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

Thank You

С уважением

Анкер Шарма

+1

В Java аргументы метода рассматриваются как локальные переменные, поэтому присвоение значения аргументу метода не влияет на вызывающего метода. Это только путает читателей вашего метода, который может подумать, что 'oldSomeObject' ссылается на значение, которое было передано, но вместо этого содержит значение, которое было присвоено ему в методе. –

+0

@AnkurSharma Каков ваш прецедент для назначения значений объектов, переданных параметром? –

+0

@Igor Ganapolsky, на самом деле это был предварительно написанный код, и нам был предоставлен код для решения только проблемных вопросов как можно больше.Я бы изменил код для вышеупомянутого назначения, но нам не разрешалось модифицировать код в то время ... так что эта ситуация возникла. –

ответ

5

Это считается плохим стилем переназначения параметров. Вы должны создать новую локальную переменную.

+0

Ну, я не пишу свежий код, Это уже существующий код, поэтому мне нужно решить все проблемы в стиле чеков. –

+0

и еще одна вещь, oldSomeObject - это просто ссылочная переменная здесь, поэтому я просто назначаю ссылку, есть ли способ? –

+0

@AnkurSharma код работает? не меняйте его. Откройте для расширения, близкого к модификации. – nachokk

2

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

Лучше использовать новую локальную переменную, если вы хотите изменить значение. Во многих случаях назначение переменных только один раз делает код более читаемым. Это не всегда возможно, но часто это так.

Try что-то вроде

Object realObject; 
if (oldSomeObject != null) { 
    realObject = oldSomeObject; 
} else { 
    realObject = newSomeObject; 
} 
+0

Это я понимаю, но дело в том, что мне нужно передать ссылку newSomeObject на oldSomeObject в случае, когда oldSomeObject имеет значение NULL, и когда оба параметра являются окончательными. –

+0

realObject имеет ссылку сейчас, это прекрасно, как я могу отнести это обратно к моему месту вызова? –

+1

, вы возвращаете его и назначаете результат вызова метода вашей переменной. – koljaTM

3

Пример метода вы предоставляете

public SomeObject someObjectBehavior(final SomeObject oldSomeObject,final SomeObject newSomeObject) { 
    if(oldSomeObject == null) { 
     oldSomeObject = newSomeObject; //Assignment operation 
    } 
} 

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

+0

Ну, я понял, что это хорошая вещь, которую накладывает стиль проверки, но что, если мой oldSomeObject имеет значение null, и мне нужно назначить ссылку newSomeObject на oldSomeObject, они являются только ссылочной переменной, поэтому, когда метод завершается , и управление возвращается к названному месту, теперь oldSomeObject и newSomeObject оба указывают на то же место в памяти (когда oldSomeObject был пустым), поэтому я хочу знать, как следует соблюдать контрольный стиль, а также не нарушать java-правила :) –

+2

@Ankur: Не имеет значения, что вы делаете с ссылкой «oldSomeObject» внутри метода, любые изменения будут отброшены после завершения метода, так как это локальная переменная. – Keppil

+0

проблема в том, что java дает мне сообщение об ошибке, это назначение не может быть выполнено, поскольку param (oldSomeOBject) является окончательным (что очевидно) .. но я думаю, что должно быть каким-то образом, когда уведомление об уведомлении стиля не должен появляться, и я также не вижу ошибок в коде. : | –

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

  • Нет связанных вопросов^_^