java - 如何用 Java 中的工厂替换静态计数变量?

标签 java oop factory

我有 0..n 个对象,每个对象都需要一个唯一的标识符,它们是通过以下方式创建的:

public class Squirrel {

    private static numSquirrels = 0;

    private String id = null;

    public Squirrel() {
        this(String.valueOf(numSquirrels++);
    }

    public Squirrel(String id) {
        this.id = id;
    }
}

这在很多方面都是一个问题,但我会给出一个:

When unit testing, the numSquirrels variable carries over between tests, even though I may be working with a different population of squirrels. That means that their IDs continue to increment when I'd like to start fresh.

  • 现在是使用 SquirrelFactory( children 非常喜欢的工厂)的正确时机吗?
  • 我应该使用依赖注入(inject)将 Factory 传递到 Squirrel 对象中,还是应该将 Squirrel 类包含在具有与外部世界接口(interface)的 Squirrel Factory 中?
  • 如果我希望用户能够设置 ID(或至少建议 ID),如何确保唯一性?

最佳答案

我认为这个实现会很好地工作,尽管如果您正在处理并发,您可能应该使用 AtomicInteger。

您的单元测试问题可以通过使用模拟和将其包装在另一个类中进行模拟的组合来解决。看这个帖子 How to mock a static variable in java using JMock

或者,一个简单的解决方案是公开静态变量的 setter,在测试用例结束时,您可以将其设置回 0,或者任何“重置”对您意味着什么。

关于java - 如何用 Java 中的工厂替换静态计数变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14758857/

相关文章:

python - 在 for 循环中使用预加载数据的线程安全方式

java - 按钮 Action 监听器错误

javascript - 实用的javascript面向对象设计模式示例

javascript - 检查对象是否有方法,而不实例化它

java - 私有(private)方法和公共(public)领域一样糟糕吗?

Javascript 对象相互交叉引用

generics - scala 有没有办法在没有示例实例的情况下生成通用实例?

java - 使用 Props 初始化 actor

java - DAO 类具有相同的 @Qualifier

java - 捕获异常后代码不工作