java胜任理由_Java在几乎所有方面均能胜任本机响应

java胜任理由

我与一位同事讨论了Java与JavaScript的话题,这是一个有问题的话题。 然后他提到React Native多么出色,我决定我必须研究一下,也许要为Codename One掌握一些想法……

那里有一些不错的主意,但是它们都不是革命性的或例外的,而且对于在Java 8中运行的Codename One开发人员来说,大多数都不是什么新鲜事。

我喜欢的一件事是React演示代码看起来有多短,所以我将其移植到Codename One上,最终得到了大致相同数量的代码,并且可以说是更好/更简单的代码!

退房的完整列表,在文章的结尾,或在github上的项目在这里 ,但让我们首先回顾了为什么Java代码是“更好”。

同步执行

JavaScript爱好者讨厌这一点,但它仍然是一个事实,即同步代码更易于阅读,跟踪和调试。 例如,这是获取数据的代码的React Native版本:

fetchData: function() {fetch(REQUEST_URL) .then((response) => response.json()) .then((responseData) => { this.setState({ dataSource: this.state.dataSource.cloneWithRows(responseData.movies), loaded: true, }); }) .done(); 
},

我有20多年的专业编程经验,这仍然很难遵循。 显然,如果省略done() ,您将不会得到任何错误处理?

它很奇怪且容易出错。 我觉得这背后隐藏着许多代码,这使简洁性比简化更为混乱(有点像通过Twitter进行政治辩论)。 对我来说,我们的代码是这样简单:

react.add(BorderLayout.CENTER, new InfiniteContainer() {public Component[] fetchComponents(int index, int amount) {try {Collection data = (Collection)ConnectionRequest.fetchJSON(REQUEST_URL).get("movies");Component[] response = new Component[data.size()];int offset = 0;for(Object movie : data) {response[offset] = createMovieEntry(Result.fromContent((Map)movie));offset++;}return response;} catch(IOException err) {Dialog.show("Error", "Error during connection: " + err, "OK", null);}return null;}
});

请注意,这与上面的代码并不完全相同,因为我们还创建了组件,将它们添加到UI并处理所产生的错误! 比较公平的比较是:

try {Collection data = (Collection)ConnectionRequest.fetchJSON(REQUEST_URL).get("movies");...
} catch(IOException err) {...
}

这实际上是一行代码,甚至可能更短,之后我们得到结果……没有流程,没有回调!

开发人员经常讨厌Java的检查异常功能,我必须同意它们有时会很痛苦(如果InterruptedException是愚蠢的),但这是为什么检查异常很重要的一个很好的例子。 我们必须正确地处理错误,并且直到我们的代码以这种可爱的“ TODO”注释正式投入生产时,我们才不能忽略它,没有人会打扰阅读。

一种语言-更少的代码

清单的大小大致相等,但是您会注意到react代码在处理JavaScript代码时会忽略本机特定于平台的代码。 我们的清单包含所有内容,不需要其他代码,也不需要其他样板,项目等。

React Native通过将标签与JavaScript代码混合来进一步有效地将声明性代码混合到常规流中。 是的,它缩短了代码,但也消除了声明式编程价值的很大一部分,即职责分离。

重新加载==应用代码更改

可以通过重新加载来调试React Native,这在使用糟糕的 Android模拟器时会有所帮助。 幸运的是,Codename One不需要该模拟器,也不需要重新启动应用程序即可重新加载已编译的更改…例如,在NetBeans中,只需在调试器中使用“ Apply Code Changes”即可,您的更改将立即镜像到正在运行的应用程序中。

脚本语言在“设备上”存在问题

这并不是“ React Native”特有的rant语,它与将JavaScript打包在应用程序捆绑包中的所有工具有关。 脚本语言非常适合网络使用,就像“管道胶带”一样。 告诉我一个不喜欢胶带的黑客!

发行带有这种胶带的应用程序的诱惑很大,但是与网络不同,在Web上,您可以通过部署新的更新来修复生产中的“奇怪的未定义”错误。 使用应用程序时,您需要通过苹果的审批流程…这意味着在您观察评分下降时,仍会存在生产错误。

是的,单元测试,lint和许多其他解决方案应该可以解决这些问题,但是当您使用现代IDE时,由于严格的语言语法,它可以检测到潜在的null推理,这真是太神奇了!

例如,关于JavaScript简化问题的一个很好的例子就是这样的代码:

function reduce(var a) {if(...) {a = a - 1;} else {a = a + 1;}
}

如果这是Java代码,那么我们可以确切地知道这里会发生什么……在JavaScript中情况并非如此! 让我们假设由于错误,只要条件为真(某种情况下在所有测试用例中都是这样),a就是某种方式为"11"的字符串,那么它将像数字一样起作用。 例如a将变为"10" 。 但是在生产中,如果条件由于某种原因变为假,则a将变为"111" 。 如果a代表某种有价值的东西(例如债务,信用等),那么在商店中有一个带有此错误的应用可能真的很痛苦。

环境

React native使用本地开发环境,这意味着它需要Mac才能进行iOS开发。 这也意味着您需要在Android IDE中完成部分工作,在Xcode中完成部分工作,并使用文本编辑器来完成JavaScript工作。 让我感到惊讶的是,开发人员愿意放弃30年的IDE演变以获取一些语法上的糖果??? 我们是否受到Eclipse的伤害? 今天的IDE令人赞叹,您可以通过单个IDE跟踪/调试整个代码这一事实非常宝贵。 我们团队具有立即查看谁使用了什么软件以及出于什么目的的功能,这真是令人震惊,我无法理解一个这样的事情是如何由超过2个人的团队使用的,尤其是在分散的员工队伍中。

我喜欢JavaScript的地方

我真正喜欢使用JavaScript的一件事是使用JSON的便捷性,而在下面的代码中,我将其大大减少到几乎与它一样优雅的大小。 我仍然不喜欢鸭子类型或脚本语言,但我真的很想将诸如属性对象之类的东西添加到Codename One中,并改进集成的解析。

最后的话

我在简洁的编程中发现的问题之一是,人们使用它来隐藏基本概念,以至于太多的事情以“不言而喻”的方式发生。 不幸的是,这使得简洁的代码像Tweet一样易于阅读,不幸的是,即使您需要表达一个中等复杂的想法,Twitter都不会削减它,而其中某些API就是一个大问题。

React native有它的粉丝,毕竟它可能比PhoneGap更好,PhoneGap有其自身的局限性。 但是,它仍然是脚本基础架构的鸡腿上的一个有限的概念。 与Codename One相比,它没有真正的优势,并且存在一些明显的潜在问题。

Java清单

public class ReactDemo {private static final String REQUEST_URL = "https://raw.githubusercontent.com/facebook/react-native/master/docs/MoviesExample.json";private Form current;private EncodedImage placeholder;public void init(Object context) {UIManager.initFirstTheme("/theme");}public void start() {if(current != null){current.show();return;}placeholder = EncodedImage.createFromImage(Image.createImage(53, 81, 0), false);Form react = new Form("React Demo", new BorderLayout());react.add(BorderLayout.CENTER, new InfiniteContainer() {public Component[] fetchComponents(int index, int amount) {try {Collection data = (Collection)ConnectionRequest.fetchJSON(REQUEST_URL).get("movies");Component[] response = new Component[data.size()];int offset = 0;for(Object movie : data) {response[offset] = createMovieEntry(Result.fromContent((Map)movie));offset++;}return response;} catch(IOException err) {Dialog.show("Error", "Error during connection: " + err, "OK", null);}return null;}});react.show();}Component createMovieEntry(Result data) {Container entry = BorderLayout.center(BoxLayout.encloseY(new SpanLabel(data.getAsString("title"), "Line1"), new Label(data.getAsString("year"), "Line2"))).add(BorderLayout.WEST, URLImage.createToStorage(placeholder, data.getAsString("id"), data.getAsString("posters/thumbnail")));return entry;} public void stop() {current = Display.getInstance().getCurrent();}public void destroy() {}
}

翻译自: https://www.javacodegeeks.com/2015/11/java-is-superior-to-react-native-in-practically-every-way.html

java胜任理由

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

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

相关文章

java发送文件_java 模拟http发送文件和参数

一、maven:org.apache.httpcomponentshttpmime4.5.3二、工具类:import java.io.File;import java.util.Map;import java.util.Map.Entry;import org.apache.http.*;import org.apache.http.client.HttpClient;import org.apache.http.client.config.Requ…

设置Elasticsearch N-Gram字分析器的过程

说n-gram是一个大话题,这是轻描淡写的。 进行快速搜索,您会发现自己盯着语言学和语言模型,数据挖掘或特定蛋白质的分解对首次亮相文化的衰落所隐含的信息量。 好吧,我在跟那最后一个开玩笑。 但是,如果您是开发人员&a…

java字节码反编译_javap 反编译 java 字节码文件

概述:javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。语法:把java文件编译为class文件:javac Test.java (Test.java为java文件名) 生成对…

javaone_JavaOne演讲者选择了您不容错过的10个会话

javaone确保会议安排中包含这些JavaOne会话 JavaOne 2015从这个星期日开始,数百个会话同时进行,因此很难筛选所有会话并选择要参加的会话。 这就是为什么我们邀请5位最喜欢的JavaOne发言人让我们了解他们的会议,并选择他们最期待的会议。 好…

java servlet文件下载_Java之Servlet文件下载20190228

jsp页面:pageEncoding"utf-8"%>Insert title here下载index.jsp下载1.jpg下载test.jspServlet:packageorg.jimmy.testwebproject2019012602.servlet.download;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjavax.se…

activiti 多租户_Activiti中具有独立数据库架构的多租户

activiti 多租户我们过去听到的一项功能请求是以多租户方式运行Activiti引擎,使租户的数据与其他数据隔离。 当然,在某些云/ SaaS环境中,这是必须的。 几个月前,波恩大学的学生拉斐尔吉伦(Raphael Gielen)…

jigsaw kaggle_使用Project Jigsaw的JDK 9 Early Access上的Eclipse IDE

jigsaw kaggle几周前,我写了关于在Java 9上运行Eclipse Neon的文章 (尽管,我在帖子标题中错误地且令人尴尬地留下了“火星”)。 值得注意的是,我列出的步骤也适用于带有Project Jigsaw (Java模块化&#xf…

win7 activemq_带有骆驼,ActiveMQ,Elasticsearch的关键HL7用例

win7 activemqML7上的HL7是可以说HL7协议格式的系统的一种非常常见的传输机制。 JBoss Fuse是一个非常强大的微服务样式集成平台,在为关键医疗保健提供者构建灵活,有弹性,高可用性的集成方案方面拥有良好的经验。 此外,在JCAPS上替…

jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7

jboss4 迁移几周前,我发布了一个有关从Java EE 5迁移到7的博客 。这主要是关于如何使用新的Java EE 7改进Java EE 5代码。 现在,在这篇文章中,我将对应用程序服务器端的迁移路径进行一些研究。 如果您使用的是Java EE 5,则很有可…

java xmlrpc2.0 实现_简单的java xmlrpc

简单的 XMLRPCjava---XmlRpcClientpackage com.company;import org.apache.xmlrpc.XmlRpcClient;import org.apache.xmlrpc.XmlRpcException;import java.net.MalformedURLException;import java.util.Hashtable;import java.util.Vector;public class…

操作方法:带有Thymeleaf和Spring Boot的Java 8日期和时间

如果您碰巧使用Spring Boot和Thymeleaf,并且需要在视图中格式化Java 8 Date&Time对象,则可以使用thymeleaf-extras-java8time –用于Java 8 Date&Time API的Thymeleaf模块。 向现有的基于Maven或Gradle的Spring Boot项目中添加th…

java boundary_上传文件multipart form-data boundary 说明

含义 ENCTYPE"multipart/form-data" 说明:通过 http 协议上传文件 rfc1867协议概述,客户端发送内容构造。概述在最初的 http 协议中,没有上传文件方面的功能。 rfc1867为 http 协议添加了这个功能。客户端的浏览器,如 M…

java 预处理语句_预处理语句PreparedStatement到底咋用啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我自己试了一下直接查询id为1的语句,有一条结果出来,但是用了PreparedStatement后就没有结果了,有大佬知道为什么吗orzpackage test;import java.io.IOException;import java.io.PrintWriter;imp…

crud-table_我个人的CRUD故事-或我如何来到CUBA平台

crud-table在此博客文章中,我想介绍一下我如何使用CUBA平台以及该工具的好处。 在我年轻的“业务应用程序开发”历史上,我将深入探讨各个阶段,只是给您一些背景知识。 因此,让我们从如何进入典型的CRUD应用程序开始,以…

python api接口生成_Django 自动生成api接口文档教程

最近在写测试平台,需要实现一个节点服务器的api,正好在用django,准备使用djangorestframework插件实现。需求实现一个接口,在调用时,通过传递的参数,直接运行对应项目的自动化测试环境Python3.6 ,PyCharm,W7项目结构功…

eclipse clean_Clean Sheet – Windows 10的人体工程学Eclipse主题

eclipse cleanClean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净,低眩光的外观和感觉,旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择,可以突出谐波语法并注重可读性。 除自定义滚动条外,它还努力满…

什么时候需要使用cqrs_在CQRS读取模型中使用Hibernate进行快速开发

什么时候需要使用cqrs在本文中,我将分享一些在CQRS读取模型中使用Hibernate工具进行快速开发的技巧。 为什么要Hibernate? Hibernate非常流行。 从外观上看,它也很容易,而从内部看,它却相当复杂。 它可以很容易地上手…

java面试题三_最全的java面试题目三

78、什么情况下调用doGet()和doPost()?答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。79、servlet的生命周期答:web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行…

python的内存管理机制及调优手段_Python的内存管理机制及调优手段

内存管理机制:引用计数、垃圾回收、内存池引用计数:引用计数是一种非常高效的内存管理手段,当一个Python对象引用时其引用计数加一,当其不再被一个变量引用时则减一。当引用计数等于0时对象被删除。1.引用计数:引用计数…

tcga癌症亚型获取_亚型多态性应用于元组的危险

tcga癌症亚型获取Java 8具有lambda和stream&#xff0c;但是没有元组&#xff0c;这真是令人遗憾 。 这就是为什么我们在jOOλ中实现了元组-Java 8的缺失部分 。 元组确实是无聊的值类型容器。 本质上&#xff0c;它们只是这些类型的枚举&#xff1a; public class Tuple2<…