public class StateQueryFilter extends FieldQueryFilter {
// private static final Log LOG = LogFactory.getLog(RecommendedParser.class.getName());
public StateQueryFilter() {
super("state", 5f);
super("city", 5f);
super("notdirectory", 5f);
//LOG.info("Added a state query");
}
}
它报告:
Constructor call must be the first statement in a constructor
有没有办法让它发挥作用?
答案 0 :(得分:7)
你只能在构造函数中调用super
一次,它必须是第一行。
在你做的事情中多次调用它甚至没有意义。调用super
不会创建新对象;它只是让超类初始化它的字段。您是否真的尝试不止一次初始化相同的字段?您可能正在尝试创建三个单独的对象,但这不是实现它的方法。
另请参阅Java教程中的Using the keyword super
。
答案 1 :(得分:2)
不。你试图构造对象3次,逻辑是有缺陷的。
答案 2 :(得分:2)
来自section 8.8.7 of the Java Language Specification:
构造函数的第一个语句 body可能是一个显式的调用 同一个类的另一个构造函数 或直接超类 (§8.8.7.1)。
注意“第一”陈述 - 你不能有多个。
答案 3 :(得分:2)
我发现调用setter丑陋的构造函数。
另一种选择是拥有一个带参数的构造函数。
public StateQueryFilter() {
super(/*state*/ 5, /* city */ 5, /*notdirectory*/ 5);
//LOG.info("Added a state query");
}
然而,看起来你应该做像
这样的事情public class StateQueryFilter extends FieldQueryFilter {
private final String city;
private final String state;
private final boolean noDirectory;
public StateQueryFilter(String city, String state, boolean noDirectory) {
this.state = state;
this.city = city;
this.notDirectory = notDirectory;
}
}
// later
FieldQueryFilter filter = new StateQueryFiler("Los Angeles", "California", true);
BTW:不要使用浮动值,它们几乎不是最佳选择。