Java 如果我全部替换,可能会出现什么问题;int";s随以“;“长”;s

Java 如果我全部替换,可能会出现什么问题;int";s随以“;“长”;s,java,types,Java,Types,假设我有超过20亿个对象,其中有一个唯一的intid字段,我决定需要扩展它。我将代码中所有相关的int标记替换为long,并在数据库中执行转换。直觉告诉我有些东西会出大问题,但我不知道是什么。如果你采取适当的预防措施,比如: 正确测试代码 使用生产数据的快照在开发服务器上进行试转换 在生产系统上使用适当的配置管理 在开始真正的转换之前备份生产数据库 等等 最糟糕的情况是,如果转换失败,您可能需要从备份中恢复。。。或者你很快就会发现不好的事情 简而言之,这与修改数据库模式的任何更改没有太大区别

假设我有超过20亿个对象,其中有一个唯一的
int
id字段,我决定需要扩展它。我将代码中所有相关的
int
标记替换为
long
,并在数据库中执行转换。直觉告诉我有些东西会出大问题,但我不知道是什么。如果你采取适当的预防措施,比如:

  • 正确测试代码
  • 使用生产数据的快照在开发服务器上进行试转换
  • 在生产系统上使用适当的配置管理
  • 在开始真正的转换之前备份生产数据库
  • 等等
最糟糕的情况是,如果转换失败,您可能需要从备份中恢复。。。或者你很快就会发现不好的事情


简而言之,这与修改数据库模式的任何更改没有太大区别。

这实际上是一个风险相当低的更改,因为任何出错的地方都很可能在编译时找到。只要小心通过反射、放入原始集合等调用的任何内容。

这种情况在某种程度上是基于我所看到/犯的错误。这也有点做作,但听起来你在寻找富有想象力的答案

假设您有一个JDBC包装器,其中使用
bind
方法将参数绑定到查询,该方法重载为
void bind(String name,int x)
void bind(String name,long x)
。。。而不是单独命名的
setInt
setLong
。。。方法

假设有人养成了在调用这些方法时总是包含冗余强制转换的习惯(例如,
query.bind(“personId”,(int)person.getId());
使目标方法显式,例如,
person.getId()的返回类型
无法更改为
String
,否则会导致编译错误(因此,任何更改person类这一方面的人都必须查看此查询并确保它仍然有意义)

现在假设在您的重构中将person ID从
int
更改为
long
,您忘记将其中一个强制转换从
(int)
更改为
(long)
,而以前是冗余的
int
强制转换现在是一个缩小操作


三年后,当标识符序列滚动经过
2^31
时,突然该演员阵容(讽刺的是,该阵容被认为是防御性的)正在截断标识符,悄悄地破坏您的数据库。

“会出现什么可怕的错误?”-你可能会被躲在你书桌下的一只豹子咬伤。来吧……发挥你的想象力。我相信你会想到很多可能出错的事情。@snetel这个问题经常被标记为Java,其中
int
long
的大小不一样。只需复制到另一列,然后转换,然后d即可删除原件,然后将副本重命名为原件的名称。通过比较两者之间的某个值进行测试,您应该是安全的。@AdamAdamaszek如果涉及数据库,您还必须将JDBC
getInt
调用替换为
getLong
,等等。您的代码使用版本控制系统,对吗?请尝试一下+1它可能会出现可怕的错误,但通过适当的测试,您很可能会让它运行得非常快。不像拥有“唯一”ID那样可怕,它有重复的ID。