【问题标题】:constructor problem in javajava中的构造函数问题
【发布时间】:2009-06-02 17:32:29
【问题描述】:
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   

有没有办法让它工作?

【问题讨论】:

  • 您想要完成什么?
  • 提升字段:"state","city","notdirectory"
  • 如果可能的话,我认为您必须使用多个过滤器。即使编译了这段代码,它仍然只会提升“notdirectory”而不是“state”或“city”。

标签: java class


【解决方案1】:

在构造函数中只能调用一次super,而且必须是第一行。

像你一样多次调用它甚至没有意义。调用super 不会创建新对象;它只是让超类初始化其字段。您真的要多次初始化相同的字段吗?您可能正在尝试创建三个单独的对象,但这不是这样做的方法。

另请参阅 Java 教程中的 Using the keyword super

【讨论】:

  • 它永远不会奏效,除非他们在几个版本前彻底改变了规则。
  • 那个代码从来没有工作过——多次调用 super(...) 是不合法的。
  • 大声笑,我喜欢人们为 Skeet 投票的方式,即使已经给出了相同的答案,但不要投票给那个答案。你已经成为一个自我实现的预言乔恩:)
【解决方案2】:

不。您尝试构造对象 3 次,逻辑有缺陷。

【讨论】:

    【解决方案3】:

    来自section 8.8.7 of the Java Language Specification

    构造函数的第一条语句 body 可能是显式调用 同一类的另一个构造函数 或直接超类 (§8.8.7.1)。

    注意“第一个”语句 - 你不能有多个。

    【讨论】:

    • 哇!我打算在 JLS 中找到它,但现在我看起来像一个答案窃贼。 :(
    【解决方案4】:

    我发现调用 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);
    

    顺便说一句:不要使用浮点值,它们几乎从来都不是最佳选择。

    【讨论】:

    • 第二个建议是避免浮动。此外,如果 setter 在子类中被覆盖,那么从构造函数调用 setter 实际上会导致问题,这会导致 vtable 未完全构造。希望您的编译器会为您内联它们,但像您在此处那样内联它可能是正确的决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2014-11-20
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    相关资源
    最近更新 更多