如何使特定参数在 Java 中唯一

How to make a specific parameter unique in Java

如何确保 class 的每个实例都具有特定参数的唯一值? 例如: public Foo(整数值); Foo 的每个实例的值应该不同。否则,它会抛出异常。

假设 Foo 的所有实例都在内存中,您可以在 Foo class 中维护一个静态 Set 来保存已使用的值。您可以在创建新实例时随时检查此集合。

另一种选择,假设这个值没有功能意义,是有一些序列(由数据库或文件支持)在创建新实例时递增,并且每个新实例的值instance 将是该序列的当前值。

我建议在 class 中包含一个静态 ArrayList,其中包含您的对象列表。但恕我直言,这是糟糕的设计。

我认为你的唯一值不应该是一个参数(它在任意调用者的控制之下),而是 Foo 的责任。

一个简单的解决方案是使用每次创建实例时递增的静态字段:

private static int instanceCounter;

// instance initializer
{
    instanceCounter++;
}

正如其他人所提到的,这表明您的设计或您对需求的理解存在问题。

请分享需求、您的预期设计以及您目前创建的代码。

编辑:'Aaron Digulla' 有一个更好的建议,即创建一个工厂来管理对象生命周期的这一方面。

创建工厂:

public Foo createFoo( int value ) {....}

在工厂代码中,可以维护一组"allocated"个值。这允许您优化代码;例如,如果值是连续的,BitSet 可能比 Set<Integer> 更好。请注意,如果您希望能够重用值,则必须以某种方式 "deallocate" Foo 的实例。

如果您只是 Foo 的 GC 实例,该值仍将是 "in use",除非您以某种方式通知工厂。

你想分配那个值,还是只是想确保你有某种 ID?

id 的最小解决方案是使用静态字段作为计数器:

public class Foo {

  private static int counter = 1;
  private int id;

  public Foo() {
    id = counter++;
  }
}

要检查分配的值,您可能需要使用某种 FooFactory:

public class FooFactory {

  private static Set<int> ids = new Set<int>();

  public static Foo createFoo(int value) {
    if (ids.contains(value)) {
      throw new FooAlreadyExistsException();
    }

    ids.add(value);
    return new Foo(value);
  }
}

或者,正如其他评论所建议的那样,您可以在 Foo 构造函数中执行此操作:

public class Foo {

  private static Set<int> ids = new Set<int>();

  public Foo(int value) {
    if (ids.contains(value)) {
      throw new FooAlreadyExistsException();
    }

    ids.add(value);
  }
}