【问题标题】:Is it impossible to perform initialization before calling a superclass's constructor?在调用超类的构造函数之前不可能执行初始化吗?
【发布时间】:2010-10-01 09:28:09
【问题描述】:

我希望具有某些构造函数参数的某个超类的子类加载一个 XML 文件,该文件包含我想传递给超构造函数的信息。这是不可能的吗?

【问题讨论】:

  • 是子类的全部目的只是为了能够用超级构建,还是它确实以更多方式扩展超级?

标签: java xml


【解决方案1】:

改用工厂方法怎么样?可能是这样的:

private MyObject(ComplexData data)
{
    super(data);
}

public static MyObject createMyObject(String someParameter)
{
    ComplexData data = XMLParser.createData(someParameter);
    return new MyObject(data); 
}

【讨论】:

  • 工厂方法不应该是静态的吗?
  • 哎呀,是的。有趣,你听起来就像我的编译器!
【解决方案2】:

你可以在 super() 调用中调用静态方法,例如

public Subclass(String filename)
{
    super(loadFile(filename));
}

private static byte[] loadFile(String filename)
{
    // ...
}

【讨论】:

    【解决方案3】:

    不可能,不。凌乱,可能非常。

    我以前需要这样做,发现最简单最干净的方法是在调用构造函数之前加载数据,然后将其作为参数传递。

    【讨论】:

    • +1 除非它是你的类工作来解析 XML,在这种情况下它看起来不像是
    【解决方案4】:

    我喜欢工厂回答,但有时您也可以这样做:

    public MyObject(String parm) {
        super(parseComplex(parm));
    }
    
    private static ComplexData parseComplex(String parm) {
        ....
        return new ComplexData(...);
    }
    

    【讨论】:

    • 我觉得在这里使用工厂有点矫枉过正,如果目的只是为了能够从 XML 解析 ComplexData(或其他任何东西)。所以我认为你的方法更好。你真的更喜欢它而不是静态方法吗?为什么?
    • 工厂方法更灵活,如果您需要为 super() 调用生成多个参数作为处理结果,它可以工作。
    【解决方案5】:

    我喜欢马修斯的建议。一种变体是创建管理预加载数据的对象,并将这些对象传递给对象的构造函数。

    我在为客户工作的项目中这样做。有一堆配置文件需要加载。在构建依赖对象之前,我还需要建立数据库和 Web 服务连接。

    它工作得很好,很简单,当其他人继承此代码时,他们将很容易遵循逻辑。这提高了客户的价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多