Подавлять предупреждения FindBugs в Eclipse

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

/** 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.

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Нормальная идиома заключается в следующем:

private final Object inputListLock = new Object();

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

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

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