2009-10-23 4 views
33

DataflowAnomalyAnalysis: Найдено 'DD'-аномалия для переменной' variable ' (строки' n1 '-' n2 ').В чем причина этих правил PMD?

DataflowAnomalyAnalysis: Найдено 'DU'-аномалия для переменной' variable ' (lines' n1 '-' n2 ').

DD и DU звук знакомый ... Я хочу сказать в таких вещах, как тестирование и анализ, относящиеся к самым слабым условиям pre и post, но я не помню специфику.

NullAssignment: присвоение объекта null - код запаха. Рассмотрим рефакторинг.

Не будет ли установка объекта для null помощи в сборе мусора, если объект является локальным объектом (не используется за пределами метода)? Или это миф?

MethodArgumentCouldBeFinal: Параметр 'пары' не назначаются и может быть объявила окончательный

LocalVariableCouldBeFinal: Локальная переменный 'переменная' может быть объявлена ​​ окончательным

Есть ли какое-либо преимущество используя параметры и переменные final?

LooseCoupling: Избегайте использования типов реализации как 'LinkedList'; использовать интерфейс вместо

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

AvoidSynchronizedAtMethodLevel: Использование на уровне блоков, а не уровень синхронизации метод

Какие преимущества синхронизации на уровне блоков имеют более синхронизации метод уровня?

AvoidUsingShortType: Не используйте короткий тип

Мои первые языки C и C++, но и в мире Java, почему я не должен использовать тот тип, который лучше всего описывает мои данные?

ответ

33
  • DD и DU аномалии (если я правильно помню — я использую FindBugs и сообщения немного отличаются), относятся к присваивание значения локальной переменной, которая никогда не читал, как правило, потому, что он переназначен другое значение перед когда-либо читаемых. Типичным случаем будет инициализация некоторой переменной с помощью null, когда она объявлена. Don't declare the variable until it's needed.

  • Присвоение null локальной переменной, чтобы «помочь» сборщику мусора - это миф. PMD дает вам знать, что это просто контрпродуктивный беспорядок.

  • Задание окончательного значения по локальной переменной должно быть очень полезно для оптимизатора, но у меня нет конкретных примеров текущих JIT, использующих этот намек. Я нашел это полезным в рассуждении о правильности моего собственного кода.

  • Задание интерфейсов с точки зрения & hellip; ну, интерфейсы - отличная практика проектирования. Вы можете легко изменять реализации коллекции, не влияя на вызывающего. Вот что такое интерфейсы.

  • Я не могу думать о многих случаях, когда абонент будет требуетсяLinkedList, так как он не раскрывает какие-либо API, не заявленные некоторый интерфейс. Если клиент полагается на этот API, он доступен через правильный интерфейс.

  • Синхронизация уровня блока позволяет критической секции быть меньше, что позволяет выполнять как можно большую работу одновременно. Возможно, что более важно, это позволяет использовать объект блокировки, который конфиденциально контролируется окружающим объектом. Таким образом, вы можете гарантировать отсутствие взаимоблокировки. Используя сам экземпляр в качестве блокировки, любой может синхронизировать его неправильно, вызывая тупик.

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

+0

Операнды типа byte также передаются в int в любых операциях. –

+0

Итак, это операнды типа 'char', но это также не относится к этому вопросу. – erickson

3

DataflowAnomalyAnalysis: Найдено 'DD'-аномалия для переменной 'переменная' (строки 'n1' -' п2').

DataflowAnomalyAnalysis: Найдено 'DU'-аномалия для переменной' variable ' (lines' n1 '-' n2 ').

Не знаю.

NullAssignment: присвоение объекта null - код запаха. Рассмотрим рефакторинг.

Не задал ли объект null помощь в сборке мусора, если объект является локальным объектом (не используется вне метода)? Или это миф?

Объекты в локальных методах помечены как мусор, собранный после возвращения метода. Установка их в значение null не будет иметь никакого значения.

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

MethodArgumentCouldBeFinal: Параметр «пары» не назначаются и может быть объявила окончательный

LocalVariableCouldBeFinal: Локальная переменный «переменная» может быть объявлена ​​ окончательного

Существует ли какое-либо преимущество использования final параметры и переменные?

Прояснить, что значение не изменится в течение жизненного цикла объекта.

Кроме того, если кто-то попытается присвоить значение, компилятор предотвратит эту ошибку кодирования при компиляции.

считает это:

public void businessRule(SomeImportantArgument important) { 
     if(important.xyz()){ 
      doXyz(); 
     } 
     // some fuzzy logic here 
     important = new NotSoImportant(); 
     // add for/if's/while etc 

    if(important.abc()){ // <-- bug 
     burnTheHouse(); 
    } 
    } 

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

Вы знаете, что еси параметр используется, то, что вы не понимаете, это ПОЧЕМУ метод burnTHeHouse вызывается, если условия не будут выполнены (в соответствии с вашими выводами)

Это может занять некоторое время, чтобы узнайте, что в какой-то момент посередине somone измените ссылку, и что вы используете другие объект.

Использование final помогает предотвратить подобные вещи.

LooseCoupling: Избегайте использования типов реализации как 'LinkedList'; использовать интерфейс вместо

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

В этом случае нет никакой разницы. Я бы подумал, что, поскольку вы не используете LinkedList конкретную функциональность, предложение справедливо.

Сегодня LinkedList может иметь смысл, но с помощью интерфейса вы помогаете себе (или другим) легко менять его, когда это не будет.

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

Также помогает менее опытному разработчику создавать хорошие привычки. [Я не говорю, что ты один, но анализатор не знает вас;)]

AvoidSynchronizedAtMethodLevel: Используйте на уровне блоков, а не уровня метода синхронизации

Какие преимущества синхронизации на уровне блоков имеют более сложную синхронизацию?

Чем меньше синхронизированный участок, тем лучше. Вот и все.

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

AvoidUsingShortType: Не используйте короткий тип

Мои первые языки C и C++, но и в мире Java, почему я не должен использовать тот тип, который лучше всего описывает мои данные?

Я никогда не слышал об этом, и я согласен с тобой :) Я никогда не использовал короткое, хотя.

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

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

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

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

0

AvoidUsingShortType: Не использовать короткий тип

  • пункт Список

    короткий составляет 16 бит, 2 в комплиментом в Java

  • короткий mathmatical operaion с чем-либо в семье Integer вне другой короткий запрос потребует преобразования расширений знака времени выполнения в больший размер. для работы с плавающей точкой требуется расширение знака и нетривиальное преобразование в IEEE-754.
  • не может найти доказательство, но с 32-разрядным или 64-разрядным регистром вы больше не сохраняете «инструкции процессора» на уровне байт-кода. Вы паркуете компактный автомобиль в месте для парковки полуприцепа, насколько это касается регистра процессора.
  • Если вы оптимизируете свой проект на уровне байтового кода, ничего себе. Просто вау. ; P
  • Я согласен с конструктивной стороной игнорирования этого предупреждения pmd, просто взвешивайте точное описание вашего объекта с «короткими» по сравнению с понесенными преобразованиями производительности.
  • на мой взгляд, понесенные хиты производительности незначительны на большинстве машин. игнорировать ошибку.
1

Не будет ли установка объекта в нуль помочь в сборе мусора, если объект является локальным объектом (не используется вне метода)? Или это миф ?

Единственное, что он делает, это сделать возможным, чтобы объект был GCd до конца метода, что редко бывает необходимо.

Есть ли какие-либо преимущества в использовании конечных параметров и переменных?

Это делает код несколько более четким, так как вам не нужно беспокоиться о том, что значение изменяется при анализе кода. Чаще всего вам не нужно или хотите изменить значение переменной, как только оно будет установлено.

Если я знаю, что конкретно нужно LinkedList, почему бы не использовать один, чтобы сделать мои намерения явно ясно будущих разработчиков?

Можете ли вы придумать какую-либо причину, по которой вам понадобится LinkedList?

Это одна вещь, чтобы вернуть класс, что это более высокое место класса пути, который имеет смысл, но почему бы я не объявить мои переменные быть в строгом смысле этого слова?

Я не слишком заботится о локальных переменных или полей, но если объявить параметр метода типа LinkedList, я буду выследить вас и причинить вам вред, потому что это делает невозможным для меня, чтобы использовать такие вещи, как Arrays.asList() и Collections.emptyList().

Какие преимущества имеет синхронизация на уровне блоков по сравнению с синхронизацией на уровне метода?

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

в мире Java, почему я не должен использовать тот тип, который лучше всего описывает мои данные ?

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

0

Какие преимущества уровень блока синхронизация имеет над уровнем метода синхронизации? Синхронизация метода похожа на блок synchronize(getClass()) и блокирует весь класс.

Может быть, вы не хотите, что

3

Просто примечание на final вопрос.

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

Пожалуйста, обратите внимание эти пункты:

  • любая переменная с final может быть сразу классифицированы в «не изменит значения во время просмотра».
  • подразумевает, что если все переменные, которые не будут меняться, будут отмечены финалистом, тогда переменные NOT, помеченные окончательным, фактически изменятся.

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