1

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

我有一个抽象类如下:

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仅在那个构造函数中使用。

解决这个问题的最佳方法是什么?

4

3 回答 3

2

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

我该如何测试呢?

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

我真的很喜欢这篇写可测试代码的文章,偶尔也会自己参考一下。

于 2013-07-22T20:06:05.437 回答
0

首先,如果你有静态工厂方法,你可以在每次调用静态工厂方法时返回相同的对象,并使用相同的文本。如果你不能这样做,你可以创建一个受保护的实例变量,或者有一个受保护的构造函数,它接受一个SomeObject参数并且只在参数为空时创建一个新的。子类可以生成SomeObject并将其传递给超类。

于 2013-07-22T19:47:55.677 回答
0

我不会对设计发表评论,但鉴于您必须按照上面提到的方式进行操作,我的建议如下:

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

希望这能解决您的问题。

干杯!!

于 2013-07-22T20:37:25.533 回答