Подавлять предупреждения 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("")
фактически не создает новую строку!)