繁体   English   中英

Java抽象类构造函数范围

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM