Java抽象类构造函数范围

时间:2013-07-22 19:43:39

标签: java abstract-class

我想知道解决这个问题的最佳方法是什么:

我有一个抽象类如下:

public abstract class AbstractTestClass
{
    public AbstractTestClass(String text)
    {
        SomeObject someObject = SomeStaticClass.getSomeObjectFromText(text);
        //etc...
        this.property1 = someObject.property1
        //basically populate properties based off of someObject
    }
}

一个示例实现:

public class AbstractTestClassImpl
{
    public AbstractTestClassImpl(String text)
    {
        super(text);
        SomeObject someObject = SomeStaticClass.getSomeObjectFromText(text);
        //do stuff with someObject that isn't done in the super constructor because it may vary per different implementations of the abstract class
    }
}

因此,从这个示例代码片段中,someObject被创建了两次,我想知道是否可以只创建一次或者只是保持原样。

显而易见的解决方案是使someObject成为AbstractClass中的成员变量,但是,我也有这样的情况:someObject根本不需要。

考虑构造函数:

public AbstractTestClass(int i, int j, char c)
{
    //do stuff where someObject is not required
}

在这种情况下,拥有一个someObject成员是没有意义的,因为根本没有使用它。

假设someObject仅用于那个构造函数。

最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

代码中最大的气味是在构造函数中调用静态类,而不是将值作为参数传递给构造函数。我认为最有帮助的是

我该如何测试?

考虑在JUnit中编写一些单元测试。 PowerMockito提供了模拟静态类的功能,但在这种情况下它不能提供有效的测试,因为测试代码必须理解代码而不是理解行为。

我非常喜欢这篇文章Write Testable Code,偶尔也会自己参考。

答案 1 :(得分:0)

首先,如果您有静态工厂方法,则可以为每次调用具有相同文本的静态工厂方法返回相同的对象。如果你不能这样做,你可以创建一个受保护的实例变量,或者拥有一个带有SomeObject参数的受保护的contstructor,如果参数为null,则只生成一个新的。子类可以生成SomeObject并将其传递给超类。

答案 2 :(得分:0)

我不会评论设计,但鉴于你必须做你上面提到的,我建议这就是:

将代码从抽象类移动到init方法中,返回对象的引用,在实现类中调用抽象类的init方法,使用返回的引用做额外的处理。

希望这可以解决您的问题。

干杯!!