【问题标题】:Java 10 'var' will spawn a bug without full rebuild [closed]Java 10 'var' 将产生一个没有完全重建的错误 [关闭]
【发布时间】:2018-09-08 00:25:38
【问题描述】:

请参考以下示例。

==== 之前 ====

---- A.java ---

var userAccounts = userService.getUserAccounts();

--- B.java

class UserService {
public OldUserAccounts getUserAccounts();
}

==== 之后 ====

---- A.java ---

var userAccounts = userService.getUserAccounts();

--- B.java

class UserService {
public NewUserAccounts getUserAccounts();
}

虽然 A.java 发生了变化,但 B.java 源文件没有变化。 B.class 文件的信息有 'userAccounts' 变量类型是 'OldUserAccounts' 你不是吗? 如果我将修改后的源文件应用于真实服务器。 'var' 会产生错误?

注意: 我知道这是一种不好的做法,即使没有 var 更改也可能是字节码不兼容的。就我而言,重建整个项目的想法并不好。 成本太高了

任何想法或解决方法?

【问题讨论】:

  • 其实变化好像在B.java中
  • 大多数程序员只会将修改后的源文件应用到真实服务器:不会。没有一个理智的人会这样做。 Sane 开发人员使用他们的构建工具来编译、组装和测试他们的代码。然后上传生成的工件(一个 jar 文件或一个 war 文件,通常伴随着几个其他文件(配置等))并替换之前的安装。服务器上不需要源文件。
  • “重建整个项目的想法对我来说不是很好。成本太高了”“成本”怎么会太多?完整的构建需要多长时间?如果您的项目太大以至于构建时间超过几分钟,那么您应该在构建服务器上进行每日构建。哎呀,不管构建时间如何,您都应该这样做。一个非常大的项目应该被分成模块(不一定是Java 9模块)。您的构建是自动化的,对吗?
  • 如果您在非常具体的情况下对var 有任何问题, 一种解决方法。在这种情况下声明类型。
  • 这与var无关。如果您使用清单类型 (OldUserAccounts u = service.getUserAccounts()) 编写 A,它将以完全相同的方式中断。问题是您进行了二进制不兼容的更改。

标签: java var rebuild java-10


【解决方案1】:

虽然 A.java 发生了变化,但 B.java 源文件没有变化。

你的意思是A.java 没有变化,即使B.java 发生了变化。

是的,如果更改B.java,则必须重新编译A.java,这取决于它。 var 在这方面没有任何改变,无论如何你都需要这样做。唯一的区别是A.java 中的源代码在您使用var 时不会更改,如果您不使用则会更改。 无论如何都需要重新编译。

大多数程序员只会将修改后的源文件应用到真实服务器。

需要引用。

大多数非玩具项目的程序员都使用适当的构建工具。使用适当的构建工具将确保您在必要时重新编译和重新部署。如果您选择重新编译和重新部署的内容,而不是总是在依赖项发生变化时重新编译类,那么您确实会遇到 Java 10 的问题——而您在 Java 9 和更早版本中已经遇到了问题。您B.java 进行不兼容的更改,无法识别您需要修改和重建 A.java,并遇到运行时不兼容问题。

var 不是您描述的场景中的问题。项目工具是。

var 完全是可选的。如果您认为它会给您的项目带来麻烦,请不要使用它。

【讨论】:

  • 趣事:局部变量的类型大多与执行无关,所以var是否被使用确实无关紧要。当返回类型改变时,它已经是在UserService 中指向OldUserAccounts getUserAccounts() 的调用指令。
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 2017-09-19
  • 2018-12-06
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多