Java - 我应该使用int,long还是Integer表示用户ID?

时间:2013-01-06 15:47:42

标签: java

当我需要对用户ID进行数值比较时,我应该执行以下操作:

int numeric_user_id = Integer.valueOf("1234343");

或者将它放入一个长的或者保持整数是否更好?

谢谢!

6 个答案:

答案 0 :(得分:7)

唯一标识符不应带有任何特殊的语义含义;的即可。 UUID或GUID类型仅为实体标识符设计,因此您不会向它们推断任何语义含义,这就是使它们不透明的原因。

许多实际好处之一是,在将数据导入和导出到不同数据库时,它们永远不会发生冲突, ie;开发,qa,生产,或在群集中使用时。如果你使用普通的旧数字,特别是自动递增的数字,每个数据库将拥有相同数字的不同用户,并且几乎不可能阻止欺骗和其他坏数据进入不同的数字系统。 UUID / GUID解决方案完全避免了这种问题。

  

有很多理由不将id用于其他任何内容   IDS。当你拥有超过30000个beta用户时会发生什么   当你想让一些人离开beta用户时会发生这种情况   程序,当......时会发生什么?

至于将id用于识别beta用户的业务逻辑,请不要使用id,使用另一个属性标志来识别它们。你可以有一个布尔标志,一个枚举或一些其他标志,甚至可以将他们是beta用户的事实与他们加入beta程序的时候合并为nullable timestamp,这会标记他们,但是通过泄露问题最终可能会降低灵活性;但在某些情况下可能是合适的。

public interface Identifiable {

    public UUID getUUID();
}

public interface BetaUser extends Identifiable {

    public boolean isBetaUser();
    public Date    joinedBetaProgramOn();
}

intlong和其他number类型只能用于 math ;不适用于与数学问题无关的身份管理或业务逻辑。

如果您想获得系统的nth用户,请按加入日期对其进行排序,并从列表中获取其索引

答案 1 :(得分:2)

我建议使用Long(一个对象,而不是一个原语),正是因为它允许一个空值。在瞬态用户对象(复制,克隆等)上操作时,可能会出现这种情况。

但是,如果要将它们保存在数据库中,请将userId列设为非空(更好的是,将其设为主键)。

使用Long而不是Integer,以便将来不必担心溢出。

不要比较userIds或尝试将它们用于任何逻辑目的(例如确定谁是测试版用户) - 将它们保留为不透明的标识符。如果您需要知道谁是测试版用户,请引入数据(例如,accountType)来跟踪该用户。

正如其他人所提到的,UUID是另一种完全可以接受的方式,并且具有相当不透明的优点(尽管不完全),非常强制执行“不解释用户ID”规则。 / p>

答案 2 :(得分:1)

我想说把它放到一个长原语中。原因是,假设您从不希望它为null,您将永远不会遇到“getUserId()”方法返回空用户ID并且未捕获错误的意外情况。

如果将它存储为long与Long或Integer,系统会立即将其检测为运行时错误。

如果将它存储在实际对象中,Like Long可能为null。如果这是一个错误,您的代码可能会在以后以不可预测的,可能是破坏性的方式失败。最好尽早发现错误。

如果它可以为null并且您使用的是真实对象,请务必编写代码来处理null情况。

至于int vs long,你必须根据你是否认为它会超过int的大小做出决定。

这也假设你唯一的选择是普通的数字类型。也许还有另一种数据结构更适合这种ID,

答案 3 :(得分:1)

在这种情况下,最好的方法是使用单独的基本类型而不是整数。

答案 4 :(得分:0)

奇怪的是仍然没有回答提倡 int 。作为自动递增的主键,足以满足99.99%的所有应用程序。此外,用户引用很多(创建者,最后编辑者,......)所以有点节省而不是长期是好的。

如果您有用户备注和其他历史项目等内容,则很长时间将用作主键。

规则:在 long 之前以 int 开始,因为对java源和数据库的修改很容易。

答案 5 :(得分:0)

int的最大值是2,147,483,647,超过2亿。在大多数情况下,int应该足够了。