1

我通常将类的每个属性设置为 final(仅适用于将在构造函数中初始化的属性)。关键是我现在正在实现一个用于测试目的的对象模型。这个 Mockup 扩展了它正在模拟的类,并且这个类具有一些最终属性。因此,我不得不在 Mockup 对象的构造函数中调用 super() 构造函数。然而,这破坏了 Mockup 的实用性,因为我不希望它以普通类的方式初始化所有属性。我宁愿调用 Mockup 构造函数而不调用 super() 并做任何我想做的事情。

我的问题是:将属性定义为 final 是否是一种好习惯,只要它们会强制您在 Mockup 中调用类构造函数吗?

编辑:我添加了一些代码。这种情况下的问题是我使用的是单例,我知道在测试时这不是一个好主意,但在这种情况下我无法更改它。所以我的意图不是在 Mockup 中调用这个方法。

public class ReportsDataManager {

private final Map<String, List<String>> translations;

public ReportsDataManager() {
this.translations = GenericUtils.getTranslation();
}

}

4

4 回答 4

3

当您可以做到时,将属性声明为 final 是一个非常好的做法。它赋予不变性 - 保证线程安全。打破它来嘲笑是一个坏主意。你的设计应该服务于用户的需求,而不是你的测试方便。

于 2013-02-27T10:59:19.330 回答
2

如果您想模拟该类,请给它一个接口并模拟该接口。此外,模拟不是 stubs。听起来你正在创建一个存根,而不是一个模拟。如果您确实希望创建一个模拟,请选择一个为您生成接口模拟的库。

于 2013-02-27T11:00:35.037 回答
1

一般来说,我会说,如果您使用的做法使测试代码更加困难,那么这种做法可能是一种气味。

尝试通过设置变量来准确确定您想要实现的目标final。会protected被接受吗?

于 2013-02-27T10:59:19.367 回答
1

final您可以使用标准反射回避限制。由于您处于模型的上下文中,因此我想这不会造成太大问题。请注意多线程问题:JVM 将假定该字段符合final语义,并会在此基础上进行优化。

于 2013-02-27T11:10:01.963 回答