[英]Java Abstract Class Constructor Scope
我想知道什么是解决此问题的最佳方法:
我有一个抽象类,如下所示:
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
仅在该构造函数中使用。
解决此问题的最佳方法是什么?
代码中最大的气味是在构造函数内部调用静态类,而不是将值作为参数传递给构造函数。 我认为最有帮助的是问
我该如何测试?
考虑在JUnit中编写一些单元测试。 PowerMockito提供了模拟静态类的功能,但是在这种情况下,它不能提供有效的测试,因为测试代码必须理解代码而不是了解行为。
我真的很喜欢这篇文章《 编写可测试的代码》 ,偶尔自己引用它。
首先,如果您具有静态工厂方法,则可以为每次调用返回相同的对象,并使用相同的文本。 如果您不能这样做,则可以创建一个受保护的实例变量,也可以让一个受保护的构造函数使用SomeObject
参数,并且仅在该参数为null时才创建一个新的参数。 子类可以创建SomeObject
并将其传递给超类。
我不会对设计发表评论,但是鉴于您必须做上面提到的事情,因此我建议:
将代码从抽象类移到返回对象引用的init方法中,在实现类中调用抽象类的init方法时,使用返回的引用进行额外的处理。
希望这可以解决您的问题。
干杯!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.