У меня есть конструктор-конструктор. Я искал способ сократить несколько несходных заявлений, которые в противном случае занимали бы много строк кода, и это пример того, что я придумал. Элемент представляет собой отдельный набор перечислений, и идея состоит в его прокрутке и добавлении значений к HashMap<Element, Double> multipliers
вне метода.Исключение в ошибке инициализатора с шаблоном Builder
Он соответствует штрафу, но я получаю условное исключение во время выполнения для multipliers.put(e, 1.0)
. Перечисление элемента определенно существует и находится в одном файле. Вопрос с похожим именем просто отвечает «сошел с ума, если что-то пошло не так в статическом блоке», это кажется абстрактным и бесполезным. Карта здесь применима только к экземплярам класса, которому назначен Builder, поэтому я включил его в конструктор. Что мне не хватает?
Это все предназначены в качестве примеров, которые мы надеемся помочь тиражированию проблемы:
public enum Element {
ALPHA("Alpha"),
BETA("Beta"),
GAMMA("Gamma"),
DELTA("Delta")
public final String name;
Element(String name) { this.name = name; }
}
Тип класс
import java.util.HashMap;
public class Type {
String name;
HashMap<Element, Double> multipliers;
Type(Builder p) {
name = p.name; multipliers = p.multipliers;
}
static class Builder {
final String name;
HashMap<Element, Double> multipliers;
public Builder(Element element) {
this.name = element.name;
// Default values
for (Element e : Element.values()) {
multipliers.put(e, 1.0);
}
}
public Builder nullify(Element... elements) {
for (Element e : elements) { multipliers.put(e, 0.0); }
return this;
}
public Type generate() { return new Type(this); }
}
}
и проверки типов, объявленных вне основных У меня есть строки, похожие на:
static Type premier = new Type.Builder(Element.ALPHA)
.nullify(Element.GAMMA, Element.DELTA)
.generate();
Можете ли вы пожалуйста распечатать трассировку стека –
Это выглядит как какая-то переменная не инициализирована. Проверьте код, чтобы узнать, равен ли элемент или множители. Если вы не можете найти, вставьте еще один код, чтобы узнать, как вы инициализируетесь и вызываете конструктор Builder. –
Пожалуйста, предоставьте [MCVE] (http://stackoverflow.com/help/mcve). В нас нет смысла гадать, что не так с кодом, который вы нам не дали. –