FindBugs сообщает о моей плохой практике, findbugs:SI_INSTANCE_BEFORE_FINALS_ASSIGNED.FindBugs: статическая инициализация экземпляра в классе
Статический инициализатор класса создает экземпляр класса до того, как будут назначены все статические конечные поля.
Мой код выглядит примерно так ..
public class Foo {
public static final Foo DEFAULT = new Foo(Bar.A, "baz");
public enum Bar {
A, B
}
private final Bar bar;
private final String baz;
public Foo(Bar bar, String baz) {
this.bar = bar;
this.baz = baz;
}
}
Я понимаю, что это маркировки использование new Foo
в качестве статической переменной внутри Foo
как плохая практика, но на самом деле не вижу проблемы.
Может кто-нибудь объяснить, почему это плохая практика, какое непреднамеренное поведение может случиться с использованием этой плохой практики и, возможно, предложить лучшую практику в качестве альтернативы?
Если вы посмотрите [здесь] (https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html), в нем говорится: 'Чтобы предоставить ту же возможность для переменных класса, язык программирования Java включает в себя статические блоки инициализации. «Вы можете использовать статические блоки для создания экземпляра класса. – SomeDude
@Svasa статический инициализатор не помогает. Там уже есть, неявно. –
Вы уверены, что получили сообщение Findbugs для опубликованного источника? Запустив код, я получаю сообщение 'L P URF_UNREAD_FIELD UrF: Непрочитанное поле: предупреждение Foo.baz'. – Robert