java - 一次编写到处运行——但是要多久?

标签 java language-agnostic

Java 提出了“一次编写到处运行”。

如何长期使用所有框架?

几年前,我用 JSF 和 richfaces 编写了一个应用程序。浏览器已经发展并引入了新功能,当然还有新错误。现在应用程序仍在运行,有时它会显示来自底层库的 javascript 错误。

由于技术“改进”,我们真的必须重新实现已完成的应用程序(没有要添加的用例)吗?

编辑:我提到的应用程序只是一个例子。如果供应商更改许可证,同样的事情很容易发生。 (Oracle 可能会对虚拟机收费,而开放式虚拟机与您的应用程序堆栈不兼容等)

最佳答案

即使我们相信“一次编写,随处运行”,这与永远的向后兼容性也不完全相同。务实地说,您必须期望框架的 future 版本会改变一些事情。有时这将是删除过去被保证的行为(最糟糕的变化),有时您的代码中的错误将不会被注意到,直到库的某些 future 版本显示您依赖的实现细节不是保证。更罕见的情况是,您的旧代码会在最新版本中揭示一个新错误。

在理想世界中,我们编写的代码仅依赖于有保证的行为,而且保证永远不会被删除,因此有效代码将永远有效。与此相反,很难证明您的程序是完全正确的,并且语言/框架/库开发人员决定他们是否可以添加他们想要的改进,同时保持完美的兼容性。

为了赢得争论的兼容性,原始 API 必须足够强大和稳定,以便在没有破坏性更改的情况下生存。如果不是,则要么进行不兼容的更改,要么完全放弃 API。无论哪种方式,你的程序都不会再运行,除非你有一个旧版本藏在某个地方运行它。

你问如何做到这一点 - 它首先需要非常好的和有点幸运的界面设计以允许你以后提出的所有扩展,或者坚定的 promise 和“业务案例”(或非-商业动机)无限期地支持“旧”版本。例如,Python 3 与 Python 2 不兼容,但 Python 2 仍受到更新的积极支持,因此旧的 Python 代码仍在运行。 C99 只删除了 C89 的一些功能,如果其他所有功能都失败了,C89 编译器仍会得到积极维护。浏览器支持一千零一个旧版本和非标准的 HTML 怪癖。我不知道 JSF 和 richfaces 与那些相比如何,或者它们输出的页面有多少依赖于客户端对“旧”(或古怪的)HTML/CSS/Javascript 行为的支持。

所以它可能会发生,至少会发生一段时间。但是有一些 IE6 功能在任何可以安全地在网络上泄露的浏览器中不再可用(我猜你可以在沙盒 VM 或你不关心的机器上运行 IE6),所以这是一个问题你最初依赖的是什么。是否可以预测专有浏览器扩展会在未来版本中像石头一样被丢弃?可能吧,但是那些 IE6 应用程序的编写者能否使用当时可用的适当标准实现他们想要的东西?不总是。即使对于那些没有接触过 IE6 的人来说,如果您的应用程序落入类似的陷阱,那您就倒霉了。

关于java - 一次编写到处运行——但是要多久?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261274/

相关文章:

algorithm - 联立方程的最小二乘解

java - 为什么 switch 语句在 case 之后继续

language-agnostic - 重用现有功能

java - 将值从 JavaScript 发送到 JSP(使用 jQuery)

algorithm - 用整数表达对象关系的目的是什么?

java - 从 Arduino 读取数据到处理中返回空结果

java - Android:在使用短信 Intent 后返回 Activity

language-agnostic - 我如何找到方法?

java - 可序列化和接口(interface) : Parcelable encountered IOException writing serializable object

java - 如何捕获该程序返回的所有值?