2010-10-20 3 views
3

Я использую строку как блокировку и поэтому хочу, чтобы объект был новым экземпляром. FindBugs жалуется, потому что обычно более эффективно определять строку напрямую (с двойными кавычками). Мой код выглядит так:Подавить предупреждения FindBugs в Eclipse

/** A lock for the list of inputs. */ 
@edu.umd.cs.findbugs.annotations.SuppressWarnings("DM_STRING_CTOR") 
//We want a new String object here as this is a lock. 
private final Object inputListLock = new String("inputListLock"); 

Я делаю что-то неправильно здесь? Плагин Eclipse, FindBugs по-прежнему сообщать об этом как проблеме:

 
Pattern id: DM_STRING_CTOR, type: Dm, category: PERFORMANCE 

Using the java.lang.String(String) constructor wastes memory because the object so constructed will be functionally indistinguishable from the String passed as a parameter. Just use the argument String directly. 
+2

Почему бы не просто решить проблему? – musiKk

+0

У меня создалось впечатление, что замена нового String («inputListLock») на «inputListLock» может вызвать проблемы, если «inputListLock» используется в другом месте. Определяя строку как новый объект, я думаю, что она избегает этой проблемы, так как тогда будут два объекта со значением «inputListLock». Может быть, это неправильно? – tttppp

+0

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

ответ

1

Итак, хотя оба ответа были интересными и полезными (+1 для обоих), я не в конечном итоге менял код, и я собираюсь принять свой собственный ответ. Чтобы удовлетворить FindBugs, я переместил аннотацию из переменной-члена в окружающий класс.

Я искал какое-то время, но я не нашел никакой информации о том, что SuppressWarnings можно применять только к классам и методам. Я также не нашел примеров того, как он применяется к переменным-членам. Поэтому, хотя это решение работает, я не знаю, что это «правильное» решение (возможно, что-то не так с моей установкой FindBugs/Eclipse, например).

+0

То, что вы написали, НЕ правильное решение, поскольку подавление на уровне класса будет подавлять каждое появление ошибки, а не только ту, которую вы сейчас интересуете.Это также включает в себя ошибки в будущем! Рассмотрим этот сценарий: FindBugs обнаруживает ложный позитив, который вы можете доказать, является ложным, и поэтому вы подавляете его, аннотируя класс. Затем через некоторое время вы случайно вводите новую, законную ошибку того же типа. Из-за аннотации, FindBugs никогда не предупредит вас об этом, что определенно не то, что вы хотите. –

+0

PS: для чего это стоит, эта проблема также возникает с [FindSecBugs] (http://find-sec-bugs.github.io/) (плагин безопасности для FindBugs) и новая аннотация '@ SuppressFBWarnings'. –

2

нормальный идиома сделать это:

private final Object inputListLock = new Object(); 

, которая экономит пространство (относительно new String("someLock")) и избавляется от надоедливого предупреждения PMD , Но если вы действительно хотите, чтобы блокировка была строкой, есть другие способы создать копию строки, с которой PMD вряд ли возражает; например

private final Object inputListLock = "some".concat("Lock"); 

(Обратите внимание, что "someLock".concat("") не создает новую строку!)

5

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

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