仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 573|回复: 9
打印 上一主题 下一主题

[学习教程] JAVA编程:怎样写出更好的Java代码仓酷云

[复制链接]
分手快乐 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的Java是最盛行的编程言语之一,但仿佛并没有人喜好利用它。好吧,实践上Java是一门还不错的编程言语,因为比来Java8公布了,我决意来编纂一个怎样能更好地利用Java的列表,这内里包含一些库,理论技能和工具。

这篇文章在GitHub上也有。你能够随时在下面奉献大概增加你本人的Java利用技能大概最好理论。


  • 编码作风

    • 布局体

      • builder形式

    • 依附注进
    • 制止null值
    • 不成变
    • 制止过量的工具类
    • 格局

      • 文档
      • Stream


  • 部署

    • 框架
    • Maven

      • 依附收敛

    • 延续集成
    • Maven仓储
    • 设置办理



    • 丢失的特征

      • ApacheCommons
      • Guava
      • Gson
      • JavaTuples
      • Joda-Time
      • Lombok
      • Playframework
      • SLF4J
      • jOOQ

    • 测试

      • jUnit4
      • jMock
      • AssertJ


  • 工具

    • IntelliJIDEA

      • Chronon

    • JRebel
    • 校验框架
    • EclipseMemoryAnalyzer

  • 资本

    • 书本
    • 播客

编码作风

传统的Java编码体例长短常碌钠笠导JavaBean的作风。新的作风更简便正确,对眼睛也更好。
布局体

我们这些码农干的最复杂的事变就是传送数据了。传统的体例就是界说一个JavaBean:
  1. publicclassDataHolder{privateStringdata;publicDataHolder(){}publicvoidsetData(Stringdata){this.data=data;}publicStringgetData(){returnthis.data;}}
复制代码
这不但拖拉并且华侈。只管你的IDE能够主动地天生这个,但这仍是华侈。因而,不要这么写。
相反的,我更喜好C的布局体的作风,写出来的类只是包装数据:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}
复制代码
如许写削减了一半的代码。不但云云,除非你承继它,否则这个类是不成变的,因为它是不成变的,因而揣度它的值就复杂多了。
假如你存储的是Map大概List这些能够简单被修正的数据,你可使用ImmutableMap大概ImmutableList,这个在不成变性这节中会有会商。
Builder形式

假如你有一个绝对庞大的对象,能够思索下Builder形式。
你在对象里边创立一个子类,用来机关你的这个对象。它利用的是可修正的形态,但一旦你挪用了build办法,它会天生一个不成变对象。
设想一下我们有一个十分庞大的对象DataHolder。它的机关器看起来应当是如许的:
  1. publicclassComplicatedDataHolder{publicfinalStringdata;publicfinalintnum;//lotsmorefieldsandaconstructorpublicclassBuilder{privateStringdata;privateintnum;publicBuilderdata(Stringdata){this.data=data;returnthis;}publicBuildernum(intnum){this.num=num;returnthis;}publicComplicatedDataHolderbuild(){returnnewComplicatedDataHolder(data,num);//etc}}}
复制代码
如今你可使用它了:
  1. finalComplicatedDataHoldercdh=newComplicatedDataHolder.Builder().data("setthis").num(523).build();
复制代码
关于Builder的利用这里另有些更好的例子,我这里举的例子只是想让你也许感觉一下。固然这会发生很多我们但愿制止的榜样代码,不外优点就是你有了一个不成变对象和一个联贯接口。
依附注进

这更像是一个软件工程的章节而不是Java的,写出可测的软件的一个最好体例就是利用依附注进(Dependencyinjection,DI)。因为Java激烈勉励利用面向对象计划,因而想写出可测性强的软件,你必要利用DI。
在Java中,这个一般都是用Spring框架来完成的。它有一个基于XML设置的绑定体例,而且仍旧相称盛行。主要的一点是你不要由于它的基于XML的设置格局而过分利用它了。在XML中应当没有任何的逻辑和把持布局。它只应当是依附注进。
另有一个不错的体例是利用Dagger库和Google的Guice。它们并没有利用Spring的XML设置文件的格局,而是将注进的逻辑放到了注解和代码里。
制止null值

假如有大概的话只管制止利用null值。你能够前往一个空的汇合,但不要前往null汇合。假如你筹办利用null的话,思索一下@Nullable注解。IntelliJIDEA关于@Nullable注解有内建的撑持。
假如你利用的是Java8的话,能够思索下新的Optional范例。假如一个值大概存在也大概不存在,把它封装到Optional类内里,就像如许:
  1. publicclassFooWidget{privatefinalStringdata;privatefinalOptional<Bar>bar;publicFooWidget(Stringdata){this(data,Optional.empty());}publicFooWidget(Stringdata,Optional<Bar>bar){this.data=data;this.bar=bar;}publicOptional<Bar>getBar(){returnbar;}}
复制代码
如今成绩就分明了,data是不会为null的,而bar大概为空。Optional类有一些像isPresent如许的办法,这让它感到跟反省null没甚么区分。不外有了它你能够写出如许的语句:
  1. finalOptional<FooWidget>fooWidget=maybeGetFooWidget();finalBazbaz=fooWidget.flatMap(FooWidget::getBar).flatMap(BarWidget::getBaz).orElse(defaultBaz);
复制代码
这比利用if来反省null很多多少了。独一的弱点就是尺度类库中对Optional的撑持并非很好,因而你仍是必要对null举行反省的。
不成变

变量,类,汇合,这些都应当是不成变的,除非你有更好的来由它们切实其实必要举行修正。
变量能够经由过程final来设置成不成变的:
  1. finalFooWidgetfooWidget;if(condition()){fooWidget=getWidget();}else{try{fooWidget=cachedFooWidget.get();}catch(CachingExceptione){log.error("Couldntgetcachedvalue",e);throwe;}}//fooWidgetisguaranteedtobesethere
复制代码
如今你能够确认fooWidget不会不当心被从头赋值了。final关头字能够和if/else块和try/catch块共同利用。固然了,假如fooWidget对象不是不成变的,你也能够很简单地对它举行修正。
有大概的话,汇合都应当只管利用Guava的ImmutableMap,ImmutableList,orImmutableSet类。这些类都有本人的机关器,你能够静态的创立它们,然后将它们设置成不成变的,。
要使一个类不成变,你能够将它的字段声明成不成变的(设置成final)。你也能够把类本身也设置成final的如许它就不克不及被扩大而且修正了,固然这是可选的。
制止大批的工具类

假如你发明本人增加了很多办法到一个Util类里,你要注重了。
  1. publicclassMiscUtil{publicstaticStringfrobnicateString(Stringbase,inttimes){//...etc}publicstaticvoidthrowIfCondition(booleancondition,Stringmsg){//...etc}}
复制代码
这些类乍一看挺吸惹人的,由于它们内里的这些办法不属于任何一个中央。因而你以代码重用之名将它们全都扔到这里了。
这么办理成绩了局更糟。把它们放回它们底本属于的中央吧,假如你的确有一些相似的经常使用办法,思索下Java8里接口的默许办法。而且因为它们是接口,你能够完成多个办法。
  1. publicinterfaceThrower{publicvoidthrowIfCondition(booleancondition,Stringmsg){//...}publicvoidthrowAorB(Throwablea,Throwableb,booleanthrowA){//...}}
复制代码
如许必要利用它的类只需复杂的完成下这个接口就能够了。
格局

格局远比很多程序员相像的要主要的多。分歧的格局申明你存眷本人的代码大概对他人有所匡助?是的。不外你先不要发急为了让代码划一点而华侈一成天的工夫在那给if块加空格了。
假如你的确必要一份代码格局标准,我激烈保举Google的Java作风指南。这份指南最出色的部分就是编程理论这节了。十分值得一读。
文档

面向用户的代码编写下文档仍是很主要的。这意味着你必要供应一些利用的示例,同时你的变量办法和类名都应当有得当的形貌信息。
结论就是不要给不必要文档的中央增加文档。假如关于某个参数你没甚么可说的,大概它已十分分明了,别写文档了。模板化的文档比没有文档更糟,由于它棍骗了你的用户,让他以为这里有文档。


Java8有一个大度的流和lambda表达式的语法。你的代码能够这么写:
  1. finalList<String>filtered=list.stream().filter(s->s.startsWith("s")).map(s->s.toUpperCase());
复制代码
而不是如许:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}0
复制代码
如许你能写出更联贯的代码,可读性也更强。
部署

准确地部署Java程序仍是必要点技能的。如今部署Java代码的支流体例有两种:利用框架大概利用自家探索出来的办理计划,固然那样更天真。
框架

因为部署Java程序其实不简单,因而才有了各类框架来用于部署。最好的两个是Dropwizard和SpringBoot。PlayFramework也能够算是一个部署框架。
这些框架都试图下降部署程序的门坎。假如你是一个Java的老手大概你必要疾速把事变弄定的话,那末框架就派上用处了。单个jar的部署固然会比庞大的WAR大概EAR部署要更简单一些。
但是,这些框架的天真性不敷,而且相称固执,因而假如这些框架的开辟职员给出的体例不太合适你的项目标话,你只能本人举行设置了。
Maven

备选计划:Gradle。
Maven仍旧是编译,打包,运转测试的尺度化工具。另有别的一些选择,好比Gradle,不外它们的接纳水平远不Maven。假如你之前没用过Maven,你能够看下这个Maven的利用示例。
我喜好用一个根POM文件来包括一切的内部依附。它看起来就像是如许。这个根POM文件只要一个内部依附,不外假如你的产物很年夜的话,你大概会有良多依附。你的根POM文件本人就应当是一个项目:它有版本把持,而且和别的的Java项目一样举行公布。
假如你以为为每一个内部依附的修正都给POM文件打个标签(tag)有点太华侈了,那是你还没有履历过花了一个礼拜的工夫来跟踪项目依附毛病的成绩。
你的一切Maven工程都应当包括你的主POM文件和一切的版本信息。如许的话,你能晓得公司项目标每一个内部依附所选择的版本,和一切准确的Maven插件。假如你必要引进一个内部依附的话,也许是如许的:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}1
复制代码
假如你必要举行外部依附的话,应当在项目标段中独自举行保护。否则的话,主POM文件的版本号就要疯涨了。
依附收敛

Java的一个最好的中央就是有大批的第三方库,它们无所事事。几近每一个API大概工具都有响应的JavaSDK,而且能够很简单地引进到Maven中来。
一切的这些Java库本身大概又会依附一些特定的版本的别的类库。假如你引进了大批的库,大概会呈现版本抵触,好比说像如许:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}2
复制代码
你的工程应当引进哪一个版本?
有了Maven的依附收敛的插件后,假如你的依附版本纷歧致的话,编译的时分就会报错。那末你有两种办理抵触的计划:


  • 在dependencyManagement区中显式地选择某个版本的bar。
  • Foo大概Widget都不要依附Bar。
究竟选择哪一种计划取决你的详细情形:假如你想要跟踪某个工程的版本,不依附它是最好的。另外一方面,假如你想要明白一点,你能够本人选择一个版本,不外如许的话,假如更新了别的的依附,也得同步地修正它。
延续集成

很分明你必要某种延续集成的服务器来不休地编译你的SNAPSHOT版本,大概对Git分支举行构建。
Jenkins和Travis-CI是你的不贰选择。
代码掩盖率也很主要,Cobertura有一个不错的Maven插件,而且对CI撑持的也不错。固然另有别的的代码掩盖的工具,不外我用的是Cobertura。
Maven库

你必要一个中央来存储你编译好的jar包,war包,和EAR包,因而你必要一个代码堆栈。
罕见的选择是Artifactory大概Nexus。两个都能用,而且各有益弊。
你应当本人举行Artifactory/Nexus的安装而且将你的依附做一份镜像。如许不会因为下载Maven库的时分堕落了导到编译中止。
设置办理

那如今你的代码能够编译了,堆栈也搭建起来了,你必要把你的代码带出开辟情况,走向终极的公布了。别纰漏了,由于主动化实行从久远来看,优点是年夜年夜的。
Chef,Puppet,和Ansible都是罕见的选择。我本人也写了一个可选计划,Squadron。这个嘛,固然了,我天然是但愿你们能下载下它的,由于它比别的那些要好用多了。
不论你用的是哪一个工具,别忘了主动化部署就好。


大概Java最好的特征就是它具有的这些库了。上面列出了一些库,应当尽年夜多半人城市用得上。
Java的尺度库,已经仍是很不错的,但在如今看来它也漏掉失落了良多关头的特征。
ApacheCommons

ApacheCommons项目有很多有效的功效。


  • CommonsCodec有很多有效的Base64大概16进制字符串的编解码的办法。别华侈工夫本人又写一遍了。
  • CommonsLang是一个字符串操纵,创立,字符集,和很多工具办法的类库。
  • CommonsIO,你想要的文件相干的办法都在这里了。它有FileUtils.copyDirectory,FileUtils.writeStringToFile,IOUtils.readLines,等等。
Guava

Guava是一个十分棒的库,它就是Java尺度库"所缺掉的那部分"。它有良多我喜好的中央,很难逐一赘述,不外我仍是想试一下。


  • Cache,这是一个最复杂的猎取内存缓存的体例了,你能够用它来缓存收集会见,磁盘会见,大概几近一切工具。你只需完成一个CacheBuilder,告知Guava怎样创立缓存就行了。
  • 不成变汇合。这里有很多类:ImmutableMap,ImmutableList,乃至另有ImmutableSortedMultiSet,假如这就是你想要的话。
我还喜好用Guava的体例来新建可变汇合:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}3
复制代码
有很多像Lists,Maps,Sets的静态类,他们都更简便易懂一些。
假如你还在保持利用Java6大概7的话,你能够用下Collections2,它有一些诸如filter和transform的办法。没有Jvaa8的stream的撑持,你也能够用它们来写出联贯的代码。
Guava也有一些很复杂的工具,好比Joiner,你能够用它来拼接字符串,另有一个类能够用来处置中止。
Gson

Google的Gson是一个复杂高效的JSON剖析库。它是如许事情的:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}4
复制代码
真的很复杂,利用它会感到十分兴奋。Gson的用户指南中有更多的示例。
JavaTuples

我对Java一个不爽的中央就是它的尺度库中竟然没有元组。侥幸的是,Javatuples工程办理了这一成绩。
它也很简单利用,而且真的很赞:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}5
复制代码
Joda-Time

Joda-Time是我用过的最好的工夫库了。几乎,间接,简单测试。你还想要甚么?
这个库里我最喜好的一个类就是Duration,由于我用它来告知说我要守候多长工夫,大概过量久我才举行重试。
Lombok

Lombok是一个十分风趣的库。它经由过程正文来削减了Java中的饱受诟病的榜样代码(注:setter,getter之类的)。
想给你类中的变量增添setter,getter办法?太复杂了:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}6
复制代码
如今你能够这么写了:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}7
复制代码
这里另有更多的示例。我还没在临盆代码顶用过Lombok,不外我有点等不及了。
Play框架

备选计划:Jersey大概Spark
在Java中完成REST作风的WEB服务有两年夜阵营:JAX-RS和别的。
JAX-RS是传统的体例。你利用像Jersey如许的工具来将注解和接口,完成组合到一同来完成WEB服务。如许做的优点就是,你能够经由过程一个接口就可以很简单创立出一个挪用的客户端来。
Play框架是在JVM上完成WEB服务的一模一样的一种体例:你有一个routes文件,然后你往完成routes中那些划定规矩所援用到的类。它实在就是个完全的MVC框架,不外你能够只用它来完成REST服务。
它同时撑持Java和Scala。它优先利用Scala这点大概有点使人懊丧,可是用Java举行开辟的话也十分不错。
假如你习气了Python里的Flask这类的微框架,那末你应当会对Spark感应很熟习。有了Java8它几乎为虎傅翼。
SLF4J

Java打印日记有很多不错的办理计划。我团体最喜好的是SLF4J,由于它是可挺插拔的,而且能够同时夹杂分歧的日记框架中输入的日记。有个奇异的工程同时利用了java.util.logging,JCL,和log4j?没成绩,SLF4J就是为它而生的。
想进门的话,看下它的这个两页的手册就充足的了。
jOOQ

我不喜好很重的ORM框架,由于我喜好SQL。因而我写了很多的JDBC模板,但它们很难保护。jOOQ是个更不错的办理计划。
你能够在Java中以一品种型平安的体例来誊写SQL语句:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}8
复制代码
将它和DAO形式分离起来,你可让数据库会见变得更复杂。
测试

测试对软件来讲相当主要。上面这些库能让测试变得加倍简单。
jUnit4

jUnit就不必先容了。它是Java中单位测试的尺度工具。
不外大概你还没有完整发扬jUnit的能力。jUnit还撑持参数化测试,和能让你少写良多榜样代码的测试划定规矩,另有能随机测试代码的Theory,和Assumptions。
jMock

假如你已完成了依附注进,那末它报答你的时分来了:你能够mock出带反作用的代码(就像和REST服务器通讯那样),而且仍旧能对换用它的代码实行断言操纵。
jMock是Java中尺度的mock工具。它的利用体例是如许的:
  1. publicclassDataHolder{publicfinalStringdata;publicDataHolder(Stringdata){this.data=data;}}9
复制代码
这段代码经由过程jMock设置了一个FooWidgetDependency,然后增加了一些希冀的操纵。我们但愿dep的call办法被挪用一次而dep的optionalCall办法会被挪用0或更屡次。
假如你重复的机关一样的FooWidgetDependency,你应当把它放到一个测试设备(TestFixture)里,然后把assertIsSatisfied放到一个@After办法中。
AssertJ

你是否是用jUnit写过这些?
  1. publicclassComplicatedDataHolder{publicfinalStringdata;publicfinalintnum;//lotsmorefieldsandaconstructorpublicclassBuilder{privateStringdata;privateintnum;publicBuilderdata(Stringdata){this.data=data;returnthis;}publicBuildernum(intnum){this.num=num;returnthis;}publicComplicatedDataHolderbuild(){returnnewComplicatedDataHolder(data,num);//etc}}}0
复制代码
这些榜样代码有点太聒噪了。AssertJ办理了这个成绩。一样的代码能够酿成如许:
  1. publicclassComplicatedDataHolder{publicfinalStringdata;publicfinalintnum;//lotsmorefieldsandaconstructorpublicclassBuilder{privateStringdata;privateintnum;publicBuilderdata(Stringdata){this.data=data;returnthis;}publicBuildernum(intnum){this.num=num;returnthis;}publicComplicatedDataHolderbuild(){returnnewComplicatedDataHolder(data,num);//etc}}}1
复制代码
联贯接口让你的测试代码可读性更强了。代码云云,夫复何求?
工具

IntelliJIDEA

备选计划:EclipseandNetbeans
最好的JavaIDE固然是IntelliJIDEA。它有很多很棒的特征,我们之以是还能忍耐Java这些冗杂的代码,它起了很年夜的感化。主动补全很棒,<ahref="http://i.imgur.com/92ztcCd.png"target="_blank">代码反省也超赞,重构工具也十分有用。
收费的社区版对我来讲已充足了,不外在旗舰版中有很多不错的特征好比数据库工具,Srping框架的撑持和Chronon等。
Chronon

GDB7中我最喜好的特征就是调试的时分能够定时间举行遍历了。有了IntelliJIDEA的Chronon插件后,这个同样成为实际了。固然你得是旗舰版的。
你能够猎取到变量的汗青值,跳回后面实行的中央,猎取办法的挪用汗青等等。第一次利用的话会感到有点怪,但它能协助你调试一些很辣手的BUG。

大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。
冷月葬花魂 该用户已被删除
沙发
发表于 2015-1-20 19:21:14 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
活着的死人 该用户已被删除
板凳
发表于 2015-1-29 16:31:04 来自手机 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
精灵巫婆 该用户已被删除
地板
发表于 2015-2-4 20:49:50 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
若天明 该用户已被删除
5#
发表于 2015-2-10 08:46:42 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
若相依 该用户已被删除
6#
发表于 2015-2-18 21:55:14 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
小女巫 该用户已被删除
7#
发表于 2015-3-6 10:59:21 | 只看该作者
是一种突破用户端机器环境和CPU
老尸 该用户已被删除
8#
发表于 2015-3-11 11:34:40 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
再见西城 该用户已被删除
9#
发表于 2015-3-18 08:07:35 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
愤怒的大鸟 该用户已被删除
10#
发表于 2015-3-25 13:53:00 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 16:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表