我想知道解决这个问题的最佳方法是什么:
我有一个抽象类如下:
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
仅用于那个构造函数。
最好的方法是什么?
答案 0 :(得分:2)
代码中最大的气味是在构造函数中调用静态类,而不是将值作为参数传递给构造函数。我认为最有帮助的是
我该如何测试?
考虑在JUnit中编写一些单元测试。 PowerMockito提供了模拟静态类的功能,但在这种情况下它不能提供有效的测试,因为测试代码必须理解代码而不是理解行为。
我非常喜欢这篇文章Write Testable Code,偶尔也会自己参考。
答案 1 :(得分:0)
首先,如果您有静态工厂方法,则可以为每次调用具有相同文本的静态工厂方法返回相同的对象。如果你不能这样做,你可以创建一个受保护的实例变量,或者拥有一个带有SomeObject
参数的受保护的contstructor,如果参数为null,则只生成一个新的。子类可以生成SomeObject
并将其传递给超类。
答案 2 :(得分:0)
我不会评论设计,但鉴于你必须做你上面提到的,我建议这就是:
将代码从抽象类移动到init方法中,返回对象的引用,在实现类中调用抽象类的init方法,使用返回的引用做额外的处理。
希望这可以解决您的问题。
干杯!!