精华内容
下载资源
问答
  • java语言冗长
    2020-06-10 20:05:21

    繁琐冗长

    Go的采用并不总是那么强劲,但是在将其纳入包括Docker在内的备受瞩目的项目之后,情况发生了变化。 Go已被《纽约时报》和BBC Worldwide使用,但Booking.com,Dropbox,SoundCloud等也已使用Go,并且这种趋势还在持续。 根据解决方案架构师和已发表的作者Shiju Varghese的博客文章 ,如果继续发展,Go的采用将成为企业中的下一个Java。

    我们与Splice的联合创始人兼CTO Matt Aimonetti进行了交谈,讨论了Go的好处,Go社区及其改进该编程语言所能采取的措施。

    JAXenter:嗨,马特! 在您的Medium帖子中,您提到Go适合每个人。 你是什​​么意思?

    马特·艾蒙内蒂(Matt Aimonetti): Go是一门新兴的热门语言,它的采用正在飞速发展。 但是,我开始注意到有人认为该语言是高级语言,因此不适合新手程序员。 新程序员被告知,他们应该首先学习一种“更轻松”的语言,然后再使用Go语言。 在我的文章中,我认为新开发人员可能实际上想从Go开始。 我还想确保社区之外的开发人员不会将Go社区视为只保留给大公司的顶尖计算机科学家和工程师使用的精英社区。 最后,我鼓励社区为新程序员创建更多文档,文章和书籍。

    JAXenter:您为什么押注Go?

    Matt Aimonetti:三年前我创办初创公司Splice时,我知道我们需要扎实的代码基础。 我不得不处理糟糕的早期启动代码很多次,以至于我希望公司在开始获得良好的吸引力时不得不处理大量的技术债务。 在评估Clojure,Scala和Go时,并发性和高性能至关重要,因此Ruby,Python和JavaScript淘汰了。 我专业地写过一些Clojure,但我知道它并不适合我(虽然我喜欢函数式编程的概念,但我似乎无法以允许我稍后重新读取/跟踪代码的方式来构造代码) 。 Scala非常吸引人,但是由于缺乏清晰的样式指导,缓慢的编译以及以这种灵活的语言组建一支团队似乎具有挑战性的事实,我选择退出。 Go可以使您的思维更加简单,编译非常快,部署非常简单,已经在非常大型的团队中进行了测试,并且社区非常支持(以及组织良好并且充满了经验丰富/聪明的人)。 我决定下注Go,因为这在当时似乎是最好的选择。 我很高兴自己做到了。

    Go给您的目的更少。

    JAXenter:有些人认为Go太复杂了。 您对此有何看法?

    马特·艾莫内蒂(Matt Aimonetti):我认为“复杂”一词已超载。 作为一种主流编程语言,Go可能是最简单的编程语言之一,语言规范很短,并且功能清单有限(有意使用)。 就是说,它确实包含了一些概念,例如您没有像JavaScript这样的语言所拥有的指针,通道和接口。 我向新程序员教授Go的经验是,指针不是问题。 因为Go不支持指针算术,所以只要他们了解按值传递与按引用传递之间的区别,他们就可以理解指针。 通道用于并发,启动时可以大大避免使用。 最后,接口不是很复杂,但是要花一些时间才能掌握。 但是,我确实同意您需要学习一些基本的编程概念,而Go的第一行可能会比浏览器中的JS第一行花费更多的时间。 不同之处在于,您在旅途中发现JS或Ruby的复杂性/局限性时会遇到意外。 Go仅有一些惊喜,一旦您获得了惊喜,一切都不会阻止您。 它为您带来的魔力更少,但这也意味着更高的可读性和更少的意外/错误。

    Go不是灵丹妙药,它可能不适合您或您的项目。

    JAXenter:Go可以帮助开发人员探索其他编程语言吗?

    Matt Aimonetti:我坚信Go是入门和扎实基础的好方法。 这个基础将帮助您学习其他语言,例如Java,C#,Ruby,Rust ...

    Go使用推断的类型,这意味着它比Java少一些冗长,但仍然可以教您类型如何工作以及它们为何有用。 同时,Go支持鸭子输入,面向对象和功能编程。 但是Go没有像Ruby这样的解释器,它不允许进行猴子补丁,并且在代码样式方面比Ruby更自以为是。 尽管Go支持面向对象的编程,但它不支持继承。 这很棒,因为一旦Gopher开始探索Java或C#,他们就可以学习更丰富的OO方法并更好地了解优点/缺点。 另一件事是,Go没有泛型(Go社区中一个非常热烈的话题),因此一旦您习惯了在没有泛型的情况下进行编码并且切换到支持它们的新语言,您将拥有良好的基础并且可以专注于这项新功能。 换句话说,Go减少了您的学习目的,因此您学习Go编码的一切都与学习另一种语言时获得的额外功能密切相关。

    JAXenter:开发人员为什么要尝试Go?

    马特·艾莫内蒂(Matt Aimonetti):哈哈,现在,我觉得您是要我向您的读者出售Go。 Go不是灵丹妙药,它可能不适合您或您的项目。 但是我认为开发人员应该很好奇,并尽可能尝试新的语言。 现有的开发人员可能对更简单的编码方法感兴趣,或者他们希望本机并发支持,更好的性能和较低的内存使用率。 Go尝试回答以下问题:“您能用更少的钱做更多的事情吗?” 而且似乎运作良好。 如果您好奇并想了解Go语言,我强烈建议您尝试一下官方的Go Tour,它是免费的,在线的,可让您领略该语言。

    非常感谢你!

    翻译自: https://jaxenter.com/go-way-less-verbose-than-java-interview-127999.html

    繁琐冗长

    更多相关内容
  • JavaBuilder项目是使用Java语言的Java项目管理和构建工具。 该工具与其他工具(例如Ant,Maven,Ivy,Gradle等)之间的主要区别在于,该构建工具使您可以直接在Java中工作。 由于您正在构建Java项目,因此可以安全...
  • 推荐课程 完整版优质java教程 java精品教学课件 Java语言程序设计 第10章 输入与输出(共38页).ppt 推荐课程 完整版优质java教程 java精品教学课件 Java语言程序设计 第11章 GUI图形用户界面设计(共129页).ppt ...
  • java语言的优缺点

    千次阅读 2020-07-22 14:40:08
    在众多编程语言中,java长期占据TIOBE编程语言排名的前面位置。尽管出现了很多新的编程语言,但是java的名声从未下降...java拥有很多让你坚持使用它的优点,让我们来具体的讨论下java语言的这些优点吧。 1.简单 ...

         在众多编程语言中,java长期占据TIOBE编程语言排名的前面位置。尽管出现了很多新的编程语言,但是java的名声从未下降过。大多数专家都不能否认java是最强、最有效的编程语言之一,并且在众多领域广泛应用。

          但是,事物均有两面性,java也不例外。下面就介绍下java的优缺点。

     

    • 优点

    java是一种面向对象的通用编程语言,可以在任何平台上创建程序和应用。java拥有很多让你坚持使用它的优点,让我们来具体的讨论下java语言的这些优点吧。

        1.简单

          java语法是简单明了的、易于编写、学习、维护、理解和代码是易于debug的。并且,java没有其他语言如:C/C++那么复杂,因为很多复杂的特性如:显示的指针概念、类存储、操作符重载等都已经从java中移除掉了。

         2.面向对象

            java是一种面向对象的语言,它能帮助我们增强代码的灵活性和可重用性。利用OOPs的概念我们可以在其他程序中很轻松的重用对象。它可以用过将数据和方法绑定到单个单元中同时阻止被外部世界访问以提高程序的安全性。

          3.安全

            java通过避免采用显示的指针以减少安全攻击和风险。因为,指针存储了另一个值得内存地址,而这个值可能导致内存被未经授权访问。而java的安全管理器可以为每一个应用定义存取规则。

           4.维护成本低

            java程序可独立于特定的硬件基础设施运行,即是可以在任何机器上运行(安装对应的JVM),这样可减少额外的维护成本。

            5.平台独立

            只要机器上安装了对应的java虚拟机(JVM),经过编译的字节码就可以在该机器上(任何系统)上运行,如下图所示:

     

         6.高级语言、可读性高

          java与C++一样,与人类语言具有相似性、可读性高,语法简单易于维护。

          7.可移植

          由于java语言的平台独立性决定了,java应用可以从一个平台移植到其他任何的平台上。

          8.内存自动回收

           java虚拟机(JVM)中内置于内存自动管理机制,当java程序中的对象不再使用时java虚拟机内存管理机制会自动触发并销毁对象回收内存,而不需要程序显示的做任何事情。

          9.支持多线程

           java是一种多线程语言,即是在同一时刻可以有多个线程在执行。多线程可以帮助我们最大化CPU的利用率。多线程共享相同的内存空间,提升应用的效率和性能。各个线程之间独立运行互不影响。

             10.稳定性

               java每次发布的版本都会增加一些新特性,让java变得更加的稳定。

              11.高效内存分配策略

                java将内存主要分为堆区域和栈区域两部分,任何时候只要声明了一个变量,JVM就会为变量自动分配内存空间(堆空间/栈空间)。

                12.分布式语言

                 java是一种分布式语言因为它提供了在多个计算机之间共享数据和程序的机制以便改善系统的性能和效率。java的远程方法调用(RMI)为分布式处理提供了支持。并且,java也支持Sokcet编程和CORBA技术以帮助我们在分布式环境中共享对象。

     

    • 缺点

                 1.运行速度相对较慢、性能相对较低

                 由于java程序编译成字节码后需要解释成机器码,在JVM解释的过程中需要额外的抽象动作以及消耗更多的内存,并且,在垃圾回收的过程中需要消耗额外的CPU时间,这就降低了运行速度和性能。这也是java比原生的底层语言C或C++运行速度慢及性能低的原因。

                  2.GUI外观及体验不佳

                  尽管java处理许多图形界面工具如:Swing,SWT,JavaFX,JSF等但是它们都不适合用于复杂的UI。

                  3.没有备份工具

                  4.占用更多的内存

                  因为java运行垃圾回收时会消耗更多的内存空间,影响系统的效率和性能。

                  5.代码不够简洁

                   Java代码是冗长的,即是有许多单词和许多长而复杂的句子,难以阅读和理解。

                

                

    展开全文
  • Java运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何Java语言限制,这个安全机制部分包括类如何从网上装载,例如装载的类是放在分开的名字空间而不是局部类,预防恶意的小应用程序用它自己的版本来...

    编程语言概述

    编程语言(programming language)可以简单的理解为一种计算机和人都能识别的语言。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。

    编程语言处在不断的发展和变化中,从最初的机器语言发展到如今的2500种以上的高级语言,每种语言都有其特定的用途和不同的发展轨迹。比如服务端开发常用到的Java,人工智能大数据方面常用到的python,展示端经常用到的脚本语言JavaScript。编程语言并不像人类自然语言发展变化一样的缓慢而又持久,其发展是相当快速的,这主要是计算机硬件、互联网和IT业的发展促进了编程语言的发展。


    编程语言的发展可以简单的分成三步,分别在应用和编写上有所提升:

    • 机器语言:这种语言主要是利用二进制编码进行指令的发送,能够被计算机快速地识别,其灵活性相对较高,且执行速度较为可观,机器语言与汇编语言之间的相似性较高,但由于具有局限性,所以在使用上存在一定的约束性。

    • 汇编语言:该语言主要是以缩写英文作为标符进行编写的,运用汇编语言进行编写的一般都是较为简练的小程序,其在执行方面较为便利,但汇编语言在程序方面较为冗长,所以具有较高的出错率。

    • 高级语言:所谓的高级语言,其实是由多种编程语言结合之后的总称,其可以对多条指令进行整合,将其变为单条指令完成输送,其在操作细节指令以及中间过程等方面都得到了适当的简化,所以,整个程序更为简便,具有较强的操作性,而这种编码方式的简化,使得计算机编程对于相关工作人员的专业水平要求不断放宽。


    高级编程语言在被计算机执行时,需要将高级语言指令转换为计算机可运行的机器语言,那根据编译机制的不同,还会将编程语言分为两类:

    • 编译型语言:高级编程语言将通过编译器软件(通常软件自带的编译软件)进行编译,生成计算机可执行的机器语言后运行机器语言输出指令,因为在编译后的运行中直接运行的机器语言,所以不会消耗额外的效率去执行编译操作,效率较高。但编译后生成的可执行文件通常因操作系统而不同,所以在不同的操作系统中要进行不同的编译,而不能将可执行文件在其他操作系统中执行。

    • 解释型语言:高级编程语言的运行将逐行逐句的进行编译,并直接操作计算机,此类语言通常用于脚本等轻量运算或对效率要求不高的应用环境。因为在运行时要兼顾编译的耗时,所以效率比编译型语言低,但运行所依赖的运行环境会因操作系统的不同而安装不同的运行环境,这样就可以将源码直接迁移到其他操作系统后,采用特定的运行环境软件来运行,可以实现跨平台的效果。


    因为编程语言会对计算机硬件的内存进行读写操作,那对内存进行空间管理和划分的区别还可以将其分为三类:

    • 强类型语言:强类型是针对类型检查的严格程度而言的,它指任何变量在使用的时候必须要指定这个变量的类型,而且在程序的运行过程中这个变量只能存储这个类型的数据。因此,对于强类型语言,一个变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。强类型是自定义类所具有的优势,它使得对象处理的数据更容易被理解。因此,强类型语言在大规模信息系统开发中具有巨大优势,特别是当设计者定义了由自定义类所组成的数据访问层,并把设计向组织内的其他程序员发布的时候。它可以通过类型检查机制在编译过程中发现许多容易被人忽视的错误,从而保证软件的质量,使得大规模的软件集成为可能。

    • 弱类型语言:弱类型的检查很弱,仅能严格的区分指令和数据,并不会强制变量数据类型在运行中的改变。弱类型语言允许变量类型的隐式转换,允许强制类型转换等,如字符串和数值可以自动转化。

    • 无类型语言:无类型不检查,甚至不区分指令和数据。

    软件概述

    软件是一系列按照特定顺序组织的计算机数据和指令的集合。一般来讲软件被划分为系统软件、应用软件和介于这两者之间的中间件,也就是说常说的Windows系统或者安卓等操作系统都属于系统软件,常用的安装到系统软件上的应用称为应用软件。软件并不只是包括可以在计算机上运行的电脑程序,与这些电脑程序相关的文档一般也被认为是软件的一部分。简单的说软件就是程序加文档的集合体。

    软件是通过编程语言来编写的指令代码来支撑运行的,并且应用软件会分为B/S架构(浏览器与服务器)和C/S(客户端与服务器)架构之分,B/S架构表示在浏览器上访问的网站其实也是软件的一种形态。

    Java概述

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

    Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

    Java的特点

    1. 简单性:Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。

    2. 面向对象:Java是一个面向对象的语言。对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为,每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。

    3. 分布性:Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器,这样网络就变成软件应用的分布运载工具。

    4. 编译和解释性:Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。

    5. 稳健性:Java消除了某些编程错误,使得用它写可靠软件相当容易。Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。可靠性方面最重要的增强之一是Java的存储模型:Java不支持指针,它消除重写存储和讹误数据的可能性。类似地,Java自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。Java解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。
      异常处理是Java中使得程序更稳健的另一个特征:异常是某种类似于错误的异常条件出现的信号。使用try/catch/finally语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。

    6. 安全性:Java的存储分配模型是它防御恶意代码的主要方法之一:Java没有指针,所以程序员不能得到隐蔽起来的内幕和伪造指针去指向存储器。更重要的是,Java编译程序不处理存储安排决策,所以程序员不能通过查看声明去猜测类的实际存储安排。编译的Java代码中的存储引用在运行时由Java解释程序决定实际存储地址。Java运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何Java语言限制,这个安全机制部分包括类如何从网上装载,例如装载的类是放在分开的名字空间而不是局部类,预防恶意的小应用程序用它自己的版本来代替标准Java类。

    7. 可移植性:Java使得语言声明不依赖于实现的方面。例如,Java显式说明每个基本数据类型的大小和它的运算行为(这些数据类型由Java语法描述)。Java环境本身对新的硬件平台和操作系统是可移植的。

    8. 高性能:Java是一种先编译后解释的语言,所以它不如全编译性语言快。但是有些情况下性能是很要紧的,为了支持这些情况,Java设计者制作了“及时”编译程序,它能在运行时把Java字节码翻译成特定CPU(中央处理器)的机器代码,也就是实现全编译了。Java字节码格式设计时考虑到这些“及时”编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。

    9. 多线程性:Java是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线程的程序设计很容易。Java的lang包提供一个Thread类,它支持开始线程、运行线程、停止线程和检查线程状态的方法。

    10. 动态性:Java语言设计成适应于变化的环境,它是一个动态的语言。例如,Java中的类是根据需要载入的,甚至有些是通过网络获取的。

    11. 跨平台:Java是一种先编译后解释的语言,编译生成的字节码文件可以在任何平台采用不同的解释器运行,并得到同样的运行结果。

    应用场景

    1. 安卓应用:许多的 Android应用都是Java程序员开发者开发。虽然 Android运用了不同的JVM以及不同的封装方式,但是代码还是用Java语言所编写。相当一部分的手机中都支持JAVA游戏,这就使很多非编程人员都认识了JAVA。
    2. 在金融业应用的服务器程序:Java在金融服务业的应用非常广泛,很多第三方交易系统、银行、金融机构都选择用Java开发,因为相对而言,Java较安全。大型跨国投资银行用Java来编写前台和后台的电子交易系统,结算和确认系统,数据处理项目以及其他项目。
    3. 网站:Java 在电子商务领域以及网站开发领域占据了一定的席位。开发人员可以运用许多不同的框架来创建web项目。即使是简单的 servlet,jsp和以struts为基础的网站在政府项目中也经常被用到。
    4. 嵌入式领域:Java在嵌入式领域发展空间很大。在这个平台上,只需130KB就能够使用Java技术(在智能卡或者传感器上)。
    5. 大数据技术:Hadoop以及其他大数据处理技术很多都是用Java,例如Apache的基于Java的HBase和Accumulo以及 ElasticSearchas。
    6. 高频交易的空间:Java平台提高了这个平台的特性和及时编译,他同时也能够像 C++ 一样传递数据。正是由于这个原因,Java成为的程序员编写交易平台的语言,因为虽然性能不比C++,但开发人员可以避开安全性,可移植性和可维护性等问题。
    7. 科学应用:Java在科学应用中是很好选择,包括自然语言处理。最主要的原因是因为Java比C++或者其他语言相对其安全性、便携性、可维护性以及其他高级语言的并发性更好。

    不同的版本

    标准版:Java SE(Java Standard Edition,Java 标准版)是Java技术的核心和基础,是Java ME和Java EE编程的基础。标准版的Java平台为用户提供一个程序开发环境,这个程序开发环境提供了开发与运行Java软件的编译器等开发工具、软件库及Java虚拟机。用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。

    企业版:Java EE是用来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java的标准版,Java EE不仅巩固了标准版中的许多优点,例如“编写一次、随处运行”的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等,同时还提供了对 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。
    Java EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用的需求。通过提供统一的开发平台,J2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序集成强有力支持,完全支持EJB,有良好的向导支持打包和部署应用,添加目录支持,增强了安全机制,提高了性能。

    Micro版:Java ME是Java微版的简称(Java Platform,Micro Edition),是一个技术和规范的集合,它为移动设备(包括消费类产品、嵌入式设备、高级移动设备等)提供了基于Java环境的开发与应用平台。Java ME分为两类配置,一类是面向小型移动设备的CLDC(Connected Limited Device Profile),一类是面向功能更强大的移动设备如智能手机和机顶盒,称为CDC(Connected Device Profile CDC)。

    编译运行方式

    Java是一种特殊的高级语言,其既具有编译型语言的特征,又具有解释型语言的特征:因为Java语言要经过先编译、后解释才能被执行。

    Java编写的程序需要先编译,但此编译不会生成特定平台的机器语言文件,而是生成一种和平台无关的字节码文件,也就是*.class文件,这种字节码文件不是可执行文件,这种文件无法在任何系统直接运行,它必须使用特定平台的解释器来解释执行。根据不同平台的Java解释器,将字节码文件解释成特定平台的机器文件:Java语言中负责解释字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。不同平台,各自实现了其JVM,JVM向编译器提供相同的编程接口,所以可解释编译器生成的字节码文件,将其解释成特定平台的机器语言文件。

    编译型语言运行效率高是因为其生产的机器语言可以直接被计算机运行和理解,但无法很好的实现跨平台,Java的编译所生成的字节码文件能够尽快的被各个平台的解释器运行,并且可以轻易的实现跨平台的效果。实际在平台运行和使用的是字节码文件,而字节码文件是通过Java源文件生成得到的。
    请添加图片描述

    展开全文
  • 主要介绍了学习不同 Java.net 语言中类似的函数结构,函数式编程语言包含多个系列的常见函数。但开发人员有时很难在语言之间进行切换,因为熟悉的函数具有不熟悉的名称。函数式语言倾向于基于函数范例来命名这些常见...
  • 它是java.lang.reflect包的简单包装。 jOOR的名称受到jOOQ的启发,jOOQ是一种用于SQL构建和执行的流利的API。 依存关系 没有任何! 下载 适用于Java 9+ < groupId>org.jooq < artifactId>joor < version>...
  • 一旦您开始使用多种语言,您可能会开始质疑现状。您可能会以不同的方式看待事物,并为您钟爱的编程语言带回一些良好的习惯。...当来自非 Java 社区的人抱怨 Java 冗长而复杂时,我实际上不明白这是

    一旦您开始使用多种语言,您可能会开始质疑现状。您可能会以不同的方式看待事物,并为您钟爱的编程语言带回一些良好的习惯。我认为“代码简单”是软件开发的一个被低估的特性,我们需要更加关注代码的可读性和简单性。

    Java 是并且一直是我在整个职业生涯中使用的主要编程语言。如果我想为原型快速构建一些东西,或者如果我需要在紧迫的期限内选择技术堆栈,那么 Java 是我的第一选择。特别是在 Java 8 之后,它的功能变得越来越丰富和强大。

    当来自非 Java 社区的人抱怨 Java 冗长而复杂时,我实际上不明白这是什么意思?

    近年来,我有机会在我的官方项目中使用 Go 和 DotNet Core 。除此之外,我还使用了NodeJS和Python,供我个人使用。

    我理解为什么很多人喜欢NodeJS和Python,因为它们是一种包含电池的东西。对于 Java 中的相同任务,您可能需要包含外部库,而在 Python/NodeJS 中,标准库本身以非详细的方式提供大多数常用功能。如果您熟悉Kotlin,那么在使用C 时您会感到宾至如归 

    我对 Go 有过这样的经历。我第一次使用它时不太喜欢它,但关于 Go 的简单让我印象深刻!

    我们来看下面的Java/SpringBoot代码。

    @Service
    @Transactional
    @RequiredArgsConstructor
    <b>public</b> <b>class</b> CustomerService {
        <b>private</b> <b>final</b> CustomerRepository customerRepository;
        <b>private</b> <b>final</b> AddressRepository addressRepository;
    
        <b>public</b> <b>void</b> createCustomer(Customer customer) {
            customerRepository.save(customer);
            addressRepository.saveCustomerAddress(customer.getAddress());
        }
    }

    对于至少使用过一次 SpringBoot 的任何 Java 开发人员,这段代码应该不需要任何解释。但是这里发生了很多事情。

    • 在为CustomerService被标记为一个Spring bean可以注入到其它Spring Bean
    • 由于 Spring 4.x 不需要在构造函数上添加@Autowired注释。如果只有一个构造函数,它将自动用于创建 bean。
    • 该类使用@Transactional进行注释,这意味着当有人调用createCustomer()方法时,将启动并在成功完成后提交数据库事务。
    • 如果customerRepository.save()或addressRepository.saveCustomerAddress()方法抛出任何RuntimeException,则事务将自动回滚。
    • 如果CustomerService.createCustomer()是从不同类的另一个事务方法调用的,那么它将在父事务中运行而不是启动新事务。

    虽然这看起来很熟悉且易于阅读,但在幕后发生了很多事情。

    让我们看看下面的 Go 代码,它的作用与上面相同:

    type CustomerService struct {
       customerRepository CustomerRepository
       addressRepository AddressRepository
    }
    
    func (c CustomerService) createCustomer(customer Customer) error {
        <font><i>// Get a Tx for making transaction requests.</i></font><font>
        tx, err := db.BeginTx(ctx, nil)
        <b>if</b> err != nil {
            <b>return</b> err
        }
        </font><font><i>// Defer a rollback in case anything fails.</i></font><font>
        defer tx.Rollback()
        
        err := customerRepository.save(tx, customer)
        <b>if</b> err != nil {
            <b>return</b> err
        }
        err = addressRepository.saveCustomerAddress(tx, customer.Address)
        <b>if</b> err != nil {
            <b>return</b> err
        }
        </font><font><i>// Commit the transaction.</i></font><font>
        <b>if</b> err = tx.Commit(); err != nil {
            <b>return</b> err
        }
        <b>return</b> nil
    }
    </font>

    嗯,这是我们上面实现的相同功能的典型 Go 实现。假设它做了它打算做的事情,乍一看,这就是我的感觉:

    • 每次第三条语句的错误检查都非常冗长
    • DB 事务处理无处不在,我们可能需要对所有 DB 交互方法重复相同的操作。
    • 业务逻辑和底层技术细节(错误/事务处理)纠缠不清

    这里没有魔法:没有隐藏的魔法。一个有 20 多年经验的开发人员可以阅读和理解这段代码,就像一个有 6 个月经验的毕业生可以阅读和理解它一样。

    但是,没有魔法意味着:……只有当你不明白它是如何运作的时候,它才是魔法。

    这一点将我引向我想讨论的下一点。但首先让我们不要急于得出哪种语言更好的结论,因为这不是本文的意图。

    开发人员在软件开发过程中面临的最大挑战是什么?

    我们都知道,与编写新代码相比,我们花在阅读现有代码上的时间更多。在典型的长期企业应用程序开发中,现有开发人员离开,新开发人员加入项目,最大的挑战是理解现有代码。如果代码很简单,那么它很容易理解。

    但是量化“代码简单性”并不容易。对你来说看起来更简单的东西,对我来说可能看起来很复杂,反之亦然。所以我们(开发人员和社区)尽最大努力寻找尽可能简单地编写代码的方法。不同的社区根据上下文、时间、需求等采取不同的方法。

    下面是我对 Java 和 Go 如何采用不同方法来实现代码简单性的看法。

    Java实现简单代码的方式:抽象

    我觉得 Java 的标准库太低级和冗长,无法执行许多常见任务,例如读取文件、进行 HTTP 调用等。为了避免样板和冗长,创建了commons-lang、Guava等库,提供更高级别的抽象屏蔽开发人员的所有低级细节。

    最重要的是,许多企业应用程序需要一组通用的功能,如日志记录、配置、监控等。因此创建框架来解决这些通用需求,抽象出通用应用程序级样板代码。

    随着时间的推移,抽象之上有抽象之上的抽象……

    但是,这些抽象通过处理应用程序级样板代码并 让您专注于业务逻辑来帮助您更快地构建业务应用 。

    这样做的缺点是:程序员如果很好奇,需要“了解这些抽象在幕后如何工作,并在框架/库中发挥作用”。

    在我看来,这就是事情严重出错的地方

    现在,每家公司都希望全栈开发人员能够编写前端、后端和一些基础设施即代码。没有时间正确学习所有这些抽象在幕后是如何工作的。为了满足交付时间表,开发人员希望尽快完成工作。在那里添加这 2 个注释,在此处添加这 4 行配置,如果它正在工作,那么它就完成了。如果遇到任何错误,请搜索 stackoverflow 中的第一个建议,如果它有效,则完成。工作已经完成,但没有任何关于它实际工作方式的线索。

    随着时间的推移,这种工作模式让人害怕说“Java 很复杂”。

    Go实现简单的方式:清晰/详细胜过聪明

    Go 社区更喜欢通过“no-magic”来保持代码简单,这意味着没有注释、没有反射、没有 ORM 等。有很多用于 ORM、Http 路由器等的库,但 Go 社区更喜欢“如果可能的话坚持标准库”方法。

    Go 社区似乎更喜欢编写更清晰和冗长的代码,而不是创建巧妙的更高抽象。

    最好的部分是使用 Go 的标准库,您可以在不需要外部依赖的情况下实现大部分应用程序需求,当然还有更多的代码行。

    冗长的好处是“任何对 Go 有点熟悉的人都可以轻松阅读任何惯用的 Go 代码并理解它”!

    如果你现在是 Go 的崇拜者,你可能会因为一遍又一遍地阅读“冗长”而生气,并问“冗长”是什么意思?

    上面代码中几乎每三行实现一次错误检查,我们检查Map是否包含键等的方式在我看来都很冗长。

    基于我对 Go 的有限经验,我非常喜欢它,因为它的“无聊”性质。为了学习 Go,我在 GitHub 上阅读了许多文章和开源代码库,没有太多新东西要学习。

    在看到几个 Go 代码存储库后,认为:从企业长期应用程序开发的角度来看,这是一件了不起的事情。学习的魔力更少,新开发人员更容易入职。

    我们如何让 Java 变得“更简单”?

    Java 是大型企业的首选是有原因的。开发速度快,上市速度快。我可以自信地说,您可以在几个小时内使用 SpringBoot/Quarkus/Micronaut 创建生产级 Java 应用程序,而不是几周或几个月。由于这些框架已经提供了包含电池的应用程序框架,您需要做的就是编写业务逻辑。

    如果我能从 Go 中汲取一些想法并将它们带到 Java,特别是 SpringBoot,那么这些将是:

    • 除非是简单的 CRUD 应用程序,否则不要用ORM。我更愿意花费编写更多代码的一次性成本而不是重复调试成本。我更喜欢 JOOQ 而 不是JPA。
    • 我知道向后兼容性是 Java/SpringBoot 成功的关键原因之一。但我喜欢从 SpringBoot 中剥离一些东西
      • 支持 XML 配置,我没有看到任何使用 XML 配置的绿地项目。XML 支持可以作为单独的模块提取。
      • 无需 从 14 个不同来源加载配置属性
      • 使用和调试 AOP 的一些更简单的方法(如果您曾经尝试过调试 AOP 代码,那么您就知道我在说什么)
      • Quarkus喜欢实时重新加载和连续测试
    • 我们真的需要“com.mycompany.myproject.mymodule”的私有业务应用程序封装结构吗?对于开源库是的,但是对于商业应用程序??

    总结

    如果您是从未尝试过 Go 的 Java 开发人员,我强烈建议您看看 Go。你可能完全喜欢也可能不喜欢 Go,但你会爱上的东西却很少。

    说了这么多,“Java 是并将永远是我最喜欢的语言”,从其他语言中学习东西的感觉很好。

    展开全文
  • Java是不是一门简单易学的、易上手的编程语言?作为一个超过10年以上工作经验的Java开发者,我觉得应该可以来回答一下。1首先说结论:Java绝对不是最容易学或者最容易上手的语言。我们稍微观察最近几年开始大规模进入...
  • C语言、C++、Java的由来,简单的梳理了编程语言的发展进程。
  • JAVA技术体系.pdf

    2022-06-06 19:44:10
    JAVA技术体系.pdfJAVA技术体系.pdfJAVA技术体系.pdfJAVA技术体系.pdfJAVA技术体系.pdfJAVA技术体系.pdfJAVA技术体系.pdfJAVA技术体系.pdfJAVA技术体系.pdf
  • import java.math.*; public class Text { public static void main(String[] args) { System.out.println("输入:"); Scanner sc=new Scanner(System.in); double x= sc.nextInt(); for(int i=10;i>=0;i--)...
  • kotlin和java语言It has been several years since Kotlin came out, and it has been doing well. Since it was created specifically to replace Java, Kotlin has naturally been compared with Java in many ...
  • 《Java数据结构和算法》(第2版)提供了一套独创的可视讨论专题用以阐明主要的论题:它使用Java语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。经验丰富的作者RorbertLafore先生...
  • Java简历模板02.docx

    2022-03-02 21:50:27
    Java简历模板02.docx
  • 作为一个初中时期接触过pascal,高中学过vb,大一学过c,现在c++和java刚好开始同时学的人,有幸刷到这个问题,来记录一波自己的经历和体会。因为大二课程比较多,个人也要考英语四六级,所以平时花在这两门计算机...
  • 3.JAVA为了面向对象而面向对象,导致程序冗长,效率低下,虽然安全性高很多,但是这个效率真的让人恶心 4.关键的关键,就是,它是一门上层语言,并不是底层语言,底层语言具有不可替代性,类似C,汇编,具有不可替代...
  • LeetCode-Java:Java实战

    2021-06-27 21:32:54
    LeetCode-Java LeetCode 实战 (Java) #语言级别 Java 8 #Verbosity Java 比 Python 更冗长。 在算法中,冗长并不是一件优雅的事情。 这段代码非常冗长: #Test 比手动调试更好。 或者,将-ea给 JVM 以启用断言。
  • jOOR,java joor中的joor-fluent反射是一个非常简单的fluent api,它以更直观的方式提供对java类结构的...jdk的反射api很难使用,而且冗长。其他语言有更简单的结构来在运行时访问类型元信息。让我们改进Java反射。.zip
  • java 方法内部方法 介绍 特定领域语言(DSL)通常被描述为针对特定类型问题的计算机语言,并且不计划解决其领域之外的问题。 DSL已经被正式研究了很多年。 然而,直到最近,内部DSL只是作为编程人员的偶然事件而被...
  • Java面试常见面试题

    2022-03-06 22:24:15
    Java基础-Java容器-并发编程-SSM框架-JVM-MySQL-Tomcat-Linux-Redis等等等 (๑•̀ㅂ•́)و✧
  • 这里还是以宠物猫为例,(不是为了水文章,因为可能全部放在一起的话,一是自己不好查找知识点,另外还有就是放在一篇blog中显得过于冗长) 在HashSet中存储了宠物猫的信息 查找需要进行查询操作的宠物猫信息 ...
  • 前阵子,看国外开发者平台 HackerRank 发布了一份开发者技能报告,其中有一项关于《2020 年你最想学的编程语言是哪个》的调查,Top 3 分别是 Go、Python 和 Kot...
  • 与许多支持函数式风格的现代语言不同,Java 默认没有内置任何类似 LINQ 的实用程序。 它也不是很可扩展,再加上 Java 1.7 中缺乏正确的类型推断、类型擦除和闭包,使得等效的 Java 源代码特别冗长。 为了提升 Java ...
  • 数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具有固定的长度,并且在内存中...在C,C++等语言中,数组的定义简洁清晰,而在Java中确有一些会让人迷惑的特性。本文就尝试分析这些特性
  • java8 集合源码 Zealot 一个简单、强大的Java动态...是基于Java语言开发SQL及对应参数动态拼接生成的工具包,其核心设计目标是帮助开发人员书写和生成出具有动态的、可复用逻辑的且易于维护SQL及其对应的参数。为了做
  • 尝试将行数保持在80列以下,但是由于Java作为语言冗长性质,可能会出现例外。 可以通过GitHub的请求请求系统或提交。执照ljpapi是免费软件:根据GNU Affero通用公共许可证的版本3,您可以自由使用,复制,修改和...
  • Java开发之Lombok指南

    2020-08-25 23:24:56
    Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。下面我们来详细了解一下吧
  • 理解Java即时编译器 像C++这样的语言被称为编译语言,因为交付的代码完全是二进制的,可以直接在CPU上执行。PHP或Perl 被称为解释语言,因为解释器(安装在目标机器上)会边运行边编译每一行代码。 Java介于两者...
  • 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。下面通过本文给分享Java8新特性之泛型的目标类型推断,感兴趣的朋友参考下吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,142
精华内容 8,056
关键字:

java语言冗长