Oracle Spring Clean JavaFX应该吗?

我们确实在Codename One上依赖JavaFX,我们的模拟器需要它。 我们的桌面版本使用它,而我们的设计器工具基于Swing。 我们希望它成功,这对我们的业务至关重要! 即使您是Java EE开发人员并且不关心桌面编程,我们也不是一个人,请记住以下事实:当今的桌面技术是明天的服务器技术。 例如:C ++和Windows(一种桌面技术)从Unix和C中获得了服务器。只能由Java(直到后来是基于Web的Applet语言)和Linux取代。 今天JavaScript可能看起来并不像JavaEE的竞争者,但是随着越来越多的开发人员从大学毕业后就喜欢JavaScript而不是Java,这将影响到我们所有人。

注意:如果您是JavaScript / NodeJS或任何其他此类脚本语言的迷,那么您不是本篇文章的目标读者……本篇文章适用于那些热爱使用Java并希望它向前发展的人。

如果有的话,他们正在重新安排兴登堡的躺椅!

斯蒂芬·科尔伯特

当我们在JavaOne 2014上租用展位时,给人的印象是,与我们交谈的Java开发人员中有90%是企业开发人员。 大多数参展商和参加人数最多的演讲也是面向企业的。 作为移动工具供应商,这比台式机开发和移动设备之间的跨越要困难得多。 它强调了一个事实,我们需要JavaFX来工作或让其变得更好,但现在需要GUI解决方案。

这篇文章不是关于JavaFX是否糟透了。 它不是关于它是否是一个好的API,也不是关于您是否可以使用它创建美观的应用程序。 它是关于修复JavaFX或将其转移到其他方面,它是关于承认其中的问题,而不是向新鲜的Java开发人员展示“一切都很好”的光环。

最初,我还撰写了有关JavaFX中的一些技术问题的文章。 我决定不参加那个讨论。 我对创建JavaFX的人表示敬佩和敬意。 其令人印象深刻的许多方面。 但是好的技术也会失败,在接下来的几节中,我将尝试详细阐述一下:

  • 推理–为什么我们都需要Java桌面API策略
  • 证明–如果您不认为JavaFX的吸引力存在严重问题,请阅读此文章
  • 我们为什么要关心? –如果您是Java EE开发人员,认为这与您无关,请阅读此内容。
  • 有什么选择? –我们如何推动Java向前发展。
  • 我们是怎么来到这里的? –如果您是Java的新手,并且本次讨论缺少历史背景,请首先阅读此内容。
  • 最终决定–我个人对我在此处列出的事实的看法。

推理

解决问题的第一步是承认我们有一个问题,现在JavaFX是Java社区努力避免的问题。 Swing非常稳定,尽管有很多问题/陷阱,但它有自己的合理吸引力。 JavaFX仍然没有达到这一地位,但是以防万一您与我不在同一页面上,我们将在下一部分中回顾证据。

这不是一篇容易写的文章,而且我相信它也不容易阅读,但是它的讨论只是在Java社区中没有发生,应该发生。 每天真正引入Java的新开发人员都无法真正了解JavaFX的问题。 让我写这篇文章的是这篇博客文章 , 这里Java Code Geeks对此进行了镜像。 我认为,尽管这篇文章是真实的(以非常主观的方式),但它也对JavaFX的状态和感知产生了错误的印象。 当我们试图说服年轻的学生学习Java时,这是非常令人不安的,我们不希望他们以后被幻灭。

如果我们不接受JavaFX的问题,将无法解决。 Java FX的当前用户包括3个原型:Swing投资巨大的公司,学生和顽固的顽固支持者。 尽管以上所有内容都很好,但是您不能基于此建立一个社区。 公司并没有在建设新事物,学生将毕业做其他事情,并成为铁杆粉丝……随着平台的衰退,他们可能一无所有。 我将在这篇文章中介绍“我们为什么要关心”这一主题,但首先免得为铁杆粉丝们证明这一点。

证明JavaFX没有牵引力

图表A:Oracle不使用JavaFX

我可以继续讨论,但是事实很清楚。 甚至基于Swing的Oracle产品也没有朝JavaFX的方向发展。 我可以发动福音人员和甲骨文公司内部的一些使用JavaFX的团队的解雇,但这似乎是多余的。 我想指出的是,尽管Oracle不再分发Scene Builder,是的,我知道它仍然可以在其他地方使用,但是如果您正在寻找Oracle正在思考的迹象的话……消息传递非常清晰。

图表B:JavaFX尚未获得发展的动力

堆栈溢出是在“ 2008年9月15日”启动的,这很重要,因为JavaFX是在“ 2008年12月4日”发布的。 实际上,当FX凭借其所有PR荣耀问世时,StackOverflow才是全新的,Swing应该一直在下降。 很少有StackOverflow存在而JavaFX不存在的时间。

基本上,这意味着与FX相比,Swing在StackOverflow上应具有更少的问题标签,令人惊讶的是,这里的数字非常令人震惊和具有决定性……JavaFX有11565个问题标签,对于一个已有7年历史的高度可见和广泛推广的项目来说,这是有意义的。 但是,应该在此期间下降的Swing产生了56,434个问题,这向我表明,即使是FX开发人员的CORE人口统计信息的Swing开发人员也没有迁移。

公平地说,JavaFX在JavaFX脚本和基于Java的JavaFX之间进行了转换。 但这应该引起社区内更多的问题和混乱。 可以说,“重新启动”引起了全世界的关注,应该已经映射到使用号。 Google趋势中的这张启发图确实标明了这一点:

javafx-vs-swing-trends

注意,Swing(具有一定的吸引力)下降了,JavaFX仍然很低,并且有效地竞争了对Swing的关注,而不是增长。 该图表可能被理解为“台式机对移动和Web失去了兴趣”,这是正确的,并且可以作为答案(请参阅下面的讨论),但是FX甚至不能胜过Swing的事实表明存在着更大的问题。 但是,让我们将其与处于类似情况下的另一家公司比较,该公司拥有一个面向桌面的工具,该工具广受欢迎并受到网络/移动设备的欢迎:

javafx-vs-swing-vs-flash-trends

如您所见,根据Google的(不科学的)趋势,恶意程度较高的Adobe Flash比Swing / FX更重要。

图表C:Dice.com同意

虽然我认为您不应该因为就业市场而选择技术,但这表明了市场的状况。 在dice.com上搜索JavaFX获得了28个职位,其中只有4个职位将Java FX视为工作的要求(我只有一个28个职位就可以一一检查!)。 “ Java FX”仅列出了12个选项。 但这就是有趣的地方了……Swing拥有198个职位! JavaEE有16,752个职位,Android有2,333个职位。

公平地说,有一个NASA承包商的工作在Java FX搜索中看起来确实很不错,但我认为上述所有结论都表明JavaFX缺乏吸引力

我们为什么要关心?

如果您是JavaFX的粉丝,那么这是不二之选。 向前跳。 但是我们其他人应该深切关注,因为桌面编程对于整个Java生态系统的健康至关重要。 Java的一大优点是在移动设备,台式机和后端之间的技能转移/工具可移植性。 作为开发人员,我们在数据中心和前台之间移动的能力在我们的行业中是无与伦比的!

Java现在在各个方面都面临挑战:服务器端的NodeJS / Ruby等,移动设备上的iOS和移动设备和台式机上HTML + JavaScript。 如果客户团队未使用Java编写应用程序,那么为什么要在服务器上使用Java? 客户团队和服务器团队使用相同的语言会不会更方便?

是的,移动设备在这里起了很大的作用,而JavaFX(或台式机)将无法从网络上接管。 但是,在企业崛起之后,随着Web的崛起,Swing占据了主导地位,JavaFX失去了这一优势。 失去这种优势可能会使甲骨文在这个利润丰厚的JavaEE市场上付出代价,并且可能使我们的技能下降,因为我们的特定技能组对需求的需求减少了(是的,我们仍然像COBOL一样赚钱,但事实并非如此。在最先进的系统上维护旧系统非常有趣)。

我们仍然需要一个桌面开发API来构建我们的IDE,我们的控制台,并在我们的计算机上执行几乎所有操作。 桌面开发API也是巨大的教学辅助工具,与部署某些Web服务相比,启动和运行UI对教学过程的影响更大。 如果您希望下一代Java开发人员,我们需要一个不错的UI选项。 你们当中的某些JavaEE开发人员(或扮演框架迷)可能会跳上HTML潮流来进行教学……

我认为,这是比讲授Java FX更好的解决方案,但实际上它比台式机编程还要难,因此您将直接与具有“家庭法院优势”JavaScript工具竞争,因为学生可能更愿意学习2种语言而不是3种语言(HTML +仅限JavaScript)。 今天的学生有时在课堂上学习JavaFX或Swing,并且经常发现他们离开教室时学习了昨天的技术! 即使您从未打算编写这样的UI,使用Java编写Java的能力对于所有Java开发人员也至关重要!

有什么选择?

希望您到此为止(至少部分地)同意存在问题。 我认为问题之一是来自Oracle的关于其对JavaFX承诺(或缺乏承诺)的消息不明确。 他们的代表非正式地表示,Oracle永远不会停止生产产品。 那是很准确的。 但是,Swing几乎已被抛弃,感觉就是这样。

修复并推广JavaFX

只有Oracle可以执行此操作。 尽管Java比Oracle强大,并且即使Oracle停止了所有活动,Java仍将继续存在,但是JavaFX不能说相同。 社区已经进行了一段时间的努力,但是像JavaFX这样的野心勃勃的项目需要认真的支持,如果Oracle无法落后于JavaFX 100%,那么它将不断下降并拖累Java。

承认JavaFX永远不会接手

这就是我所提倡的。 JavaFX在这里保持与AWT相同的方式,但是一旦我们接受了它永远不会超过其当前有限范围的情况,这便为Java客户端开发提供了可能性。 这也意味着我们应该开始专注于新事物,也许某些事物可能会取代新事物。

我认为,最重要的是将学生从JavaFX转移到Java的更具可持续性的领域,例如较新的服务器/ HTML框架或移动领域,这仍将为您提供一些令人愉悦的“麻木”体验用户界面可以运行,但可以提供更可持续的技能。 我花了几天时间试图在台式机上提出JavaFX的潜在替代方案,但不幸的是,目前还没有认真的竞争者。 也许我在下面列出的竞争者之一将完成这项任务:

  • SWT – SWT尚未成熟。 在设计时,将其建模为Win32 API似乎是正确的选择,但随着向移动和Mac的迁移,它现在已成为一个有问题的竞争者。 它虽然成熟,但众所周知。
  • 摇摆-返回摇摆可能不是一种选择,因为已经花费了太多时间。 由于它与JDK集成在一起,因此任何东西都需要进入JVM并通过Oracle。
  • QT –在我的C ++时代,我曾经非常喜欢QT。 自那以来,它增加了一些东西,但是自从诺基亚购买以来,它大部分都固定在原处。 此外,大多数代码库都是C ++的事实使大多数Java开发人员都无法使用它。
  • 本机–实际上,我们正在考虑将其用于Codename Ones桌面端口。 只需使用Java本地映射API直接调用OS本机API。 对于Codename One,这非常简单,因为我们可以使用Open GL,很少使用同位体,但是我认为这对整个Java开发人员都不有用。
  • HTML5 –我认为JavaScript在HTML方面具有巨大优势。 如果HTML或浏览器是主导者,那么为什么要使用Java? JavaScript在HTML世界中已经具有牵引力和工具包,而Java在那似乎很陌生。
  • DukeScript / TeaVM / GWT –我真的很喜欢所有这些功能,并且与HTML集成的功能很强大,但是我认为将所有精力都集中在这些工具上最终可以将Java替换为看起来像贬低的咖啡脚本替代品。
  • Android –像代号一样,Android不是为台式机设计的。 但与我们不同的是,它已适应台式机(根据传闻取代了Chrome操作系统)。 它是一个庞大,复杂且相当完整的API,缺少一些关键功能,但仍然非常强大。 唯一的问题是,在移植工作和向非常映射到移动设备的API(Windows等)中添加桌面“概念”方面,这都需要付出大量的努力。

我们是怎么来到这里的?

对于大多数读者来说,本节可能是多余的,但是在写完以上所有内容之后,我发现一个刚读完我的文章的Java开发人员几乎没有什么历史背景。 幸运的是,在Java FX的预览期间,我在Sun Microsystem和Oracle担任前排席位,因为未能实现,所以我可以很容易地回顾历史。

Java与AWT一起发布,这是一个非常有问题的“冲向市场” GUI API。 Sun希望改进AWT并用Swing代替它,不幸的是,当时Netscape(领先的浏览器供应商,利润颇丰)已经在Java 1.1上进行了标准化,而Microsoft也被困在那儿。

因此,Swing是经过折衷开发的,旨在使其能够在当时是Java的主要用户的浏览器中工作。 这一点历史很重要,因为它可以完美地解决FX中的问题。 大约十年前,Chris Oliver(Sun工程师)介绍了他编写的一种很酷的脚本语言,并在Sun中获得了一定的吸引力。 当时,Swing在企业中很受欢迎,但在消费者市场上逐渐失去了Flash的地位。

Sun的经理们决定推广这种想法,并为这种新语言投入了大量的精力和资源,最终将其命名为JavaFX Script。 从Swing中删除了许多开发人员资源,并将其放入JavaFX脚本项目中,并向开发人员做出了很多承诺。 我实际上帮助了一些相关项目,例如手机端口等。

JavaFX Script存在许多问题,Sun的麻烦以及众所周知的宽松管理风格进一步加剧了这些问题。 随着Oracle收购Sun,SwingSwift下降。 Oracle取消了JavaFX脚本,但是喜欢它背后的许多API想法,因此他们将JavaFX的工作重新定位为基于Java的API。 通常,这是一个好主意,但是以典型的公司方式,每个使用JavaFX Script的人都必须立即将其应用程序移植到新的JavaFX上,否则就无法下载VM(在后来他们撤消了这个决定,但这并不是最好的方法,但是无法下载VM)。对待早期的适配器)。

新的JavaFX API花费了数年的时间,而且有一段时间甚至没有开放或未正确集成到JDK中。 到目前为止,它的集成还只是其中的一部分,它仍然不是Open JDK(在Linux上很重要)的一部分。

当JavaFX团队组建并成长时,他们做出了一个重要的决定,后来又困扰了他们:不要重蹈Swing / AWT的覆辙,而是要构建一个干净的,不受遗留负担的API。 不幸的是,作为发达国家一家大公司的产品,他们需要支持很多东西(例如可访问性),因此需要从头开始编写大量代码。

因此,该团队创建了一个设计良好的API,但没有到Swing开发人员的良好迁移路径,而且从某种程度上来说,从Swing到今天都有(尽管有很多改进)。 该API庞大,但在某些方面仍不完整,因为此类API所需的宽度。 同时,多年来没有任何实际更新的Swing开发人员大多都转移到了其他平台上,现在我们拥有Swing和FX,其中一个已过时,而另一个品牌却崭新,但没有真正的吸引力。

我认为JavaFX的最大教训是始终“精打细算”并经常发布。 即使您拥有Sun / Oracle能够使用的全套资源,从一开始就尝试构建完整的解决方案也很少见。 我认为JavaFX中的所有问题都是管理不善的结果。

最后的话

在拉里·佩奇(Larry Page)的带领下,我最讨厌Google的事情之一是Spring大扫除,因为Android Google未能创造出具有这种吸引力的产品。 那不是由于缺乏尝试,而是由于缺乏对任何事物的承诺。 大多数人都不记得这一点,但是Android最初发布时(G1)就是一个失败,而iPhone的关注度很小(相对于整个移动市场而言)。 两家公司都坚持了下去,并在缓慢迭代产品的同时投资了产品/合作伙伴关系。 这花费了金钱,时间和承诺,这很难做到。

不幸的是,请查看JavaFX的当前状态及其对Oracle的支持。 很明显,它已经移至维护模式,并且无法获得增长所需​​的资源。 我认为我们最好将其移开并允许其他技术脱颖而出。 即使您不同意这种观点,我希望我们都可以同意这里存在严重问题。 对我而言,问题主要在于学生通过大学或在线课程学习JavaFX。 我们不妨教他们COBOL,也有写COBOL的工作。

鉴于JavaFX的当前状态以及缺乏竞争者来占据其空间(目前尚未正式空缺),我觉得我们可能会一事无成。 至少到那时,我们的桌面API应该驻留在其虚拟前院中会有一个很大的“空缺”迹象。 这将使我上面列出的选项之一(或全新的选项)占据那个位置……也许会触发Oracle的某个人最终为JavaFX提供将其转变为可行工具所需的资源,但知道Oracle…我不持有我的呼吸。

翻译自: https://www.javacodegeeks.com/2015/11/should-oracle-spring-clean-javafx.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

laravel mysql 锁表_Laravel中MySQL的乐观锁与悲观锁

MySQL/InnoDB的加锁,是一个老生常谈的话题。在数据库高并发请求下,如何兼顾数据完整性与用户体验的敏捷性是一代又一代程序员一直在思考的问题。乐观锁乐观锁之所以叫乐观,是因为这个模式不会对数据加锁。而是对数据操作保持一种乐观的心态&a…

mysql 超长记录_谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)...

【问题】最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息。有一台测试服务器也有类似的问题,为什么会记录这些信息&#xf…

glassfish发布应用_Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 所有虫子死亡!...

glassfish发布应用红帽公司和JBoss社区今天宣布的1.0.0.Final发布的Arquillian ,其屡获殊荣的建在Java虚拟机(JVM)运行测试平台。 Arquillian大大减少了编写和执行Java中间件集成和功能测试所需的工作。 它甚至使测试工程师能够解决以前认为无…

使用ADF列表视图的主从数据

最近,从UI角度来看,ADF Faces 表组件不再被认为很酷。 对于显示数据集合, 列表视图今天应该很酷。 这并不意味着我们根本不应该使用af:table 。 在某些情况下(经常是:)),表比列表视图更适合。 但…

java 调用私有方法_公开调用私有Java方法?

java 调用私有方法我们是Java开发人员,在Java中已知4种访问修饰符:私有,受保护,公共和包。 好吧,除了私有以外,最后三个可以通过继承,相同的包或实例从类外部调用。 现在,常见的问题…

港航环境变化引起的错误解决方法

1.serlvet API缺少,pom.xml中引入坐标; 2.web.xml中出现错误,将所有的filter调到filtermapping上面去; 3.依赖导入完成后项目依然有红叉,右击项目Propreties->myeclipse->Project Facets->java换成1.6就可以了…

flutter 国际化_从0开始设计Flutter独立APP | 第二篇: 完整的国际化语言支持

鉴于Flutter高性能渲染和跨平台的优势,闪点清单在移动端APP上,使用了完整的Flutter框架来开发。既然是完整APP,架构搭建完全不受历史Native APP的影响,没有历史包袱的沉淀,设计也能更灵活和健壮。国际化语言的支持&…

将旧版本从Java EE 5减少到7

Java EE 5于2005年首次引入,而Java EE 7于2013年问世。这两个版本之间有7年的差距,从技术角度来说,这就像一个世纪。 许多组织仍然对使用Java EE 5感到困惑,并且有很多正当理由选择不升级。 不过,如果您考虑一些前进的…

sql插入临时表数据的方法

方法有两种,主要看需求。 方法1:定义好临时表的字段和类型、插入对应的值 create table #Tmp --创建临时表#Tmp (City varchar(50), --Country varchar(50), -- );insert #Tmp select 北京,中国 union select 东京,日本 union select 纽约,美国 se…

gulp

1.gulp是什么? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用她,不仅可以很愉快的编…

往vxe-table添加渲染器怎么添_赚大了!飘窗上装书桌,加扇折叠窗,等于为家里又多添一间房...

阅读本文前,请您先点击上面蓝色字体,再点关 注这样您就可以继续免费收到文章注:本文转载自网络,如有侵权,请在后台留言联系我们进行删除,谢谢! …

【六大排序详解】中篇 :选择排序 与 堆排序

选择排序 与 堆排序 选择排序 选择排序 与 堆排序1 选择排序1.1 选择排序原理1.2 排序步骤1.3 代码实现 2 堆排序2.1 堆排序原理2.1.1 大堆与小堆2.1.2 向上调整算法2.1.3 向下调整算法 2.2 排序步骤2.3 代码实现 3 时间复杂度分析 Thanks♪(・ω・)&#…

java中contains的用法_java容器中所有接口和类的用法

我这里讲一下如何下载java的api文档还有就是容器和容器之间进行的操作每一个地方称之为一个节点,每一个节点包含了3部分(上一个节点,下一个节点,以及我们自己的数据部分)需要多个线程共享的时候通过键对象来找值对象1 java中的length属性是针…

lcs文本相似度_具有LCS方法的通用文本比较工具

lcs文本相似度常见的问题是检测并显示两个文本的差异(尤其是几百行或几千行)。 使用纯java.lang.String类方法可能是一种解决方案,但是对于此类操作最重要的问题是,“性能”将不能令人满意。 我们需要一种有效的解决方案&#xff…

MySQL--开发技巧(一)

Inner Join: Left Outer Join: Right Outer Join: Full Join: Cross Join: SELECT t1.attrs ,t2.attrs FROM t1 CROSS JOIN t2 使用Join更新表: UPDATE table1 SET attr2 WHERE attr1 IN (SELECT table2.attr1 FROM table1 INNER JOIN table2 ON tab…

js url解码gbk_使用js解码gbk编码的字符串

如下字符串为 “产后恢复肚子”%B2%FA%BA%F3%BB%D6%B8%B4%B2%D9%CA%D3%C6%B5%BD%CC%B3%CC直接使用js的解码函数解码得到的都是乱码,可以使用下面的函数进行解码/*** js解码gbk url编码的字符串* param {[type]} str gbk编码字符串* param {[type]} charset 字符串的…

mysql 5.7 insert_MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器

在MySQL5.6版本里,不支持一个表有多个INSERT/DELETE/UPDATE触发器。例如创建t1表两个INSERT的触发器:DELIMITER $$USE test$$DROP TRIGGER /*!50032 IF EXISTS */ t1_1$$CREATE/*!50017 DEFINER ‘admin‘‘%‘ */TRIGGER t1_1 AFTER INSERT ON t1FOR E…

Java回调机制解读

模块间调用 在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种: (1)同步调用 同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b()&#…

Java TDD简介–第1部分

欢迎来到测试驱动开发 (TDD)系列的介绍。 我们将在TDD上下文中讨论Java和JUnit ,但这只是工具。 本文的主要目的是使您全面了解TDD,而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD,那么您要么很懒&…

状态模式 处理订单状态_将状态机模式实现为流处理器

状态模式 处理订单状态在我的上一个博客中,我说过我真的以为某些“四人行”(GOF)模式已经过时了,如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine没什么用,因为您通常会想到另一种更简单的方式来执行您正在执…