如何使特定参数在 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);
}
}
如何确保 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);
}
}