网站首页 网站导航 课程中心
新闻中心
您所在的位置:Java培训 > 新闻中心 > Java的最佳实践(二)

Java的最佳实践(二)

来源:中软卓越 日期:2017-05-19 14:41 人气:
标签: Java培训  Java学习  Java开发 
中软国际教育集团Python+大数据课程入驻大武汉啦!!!

Java的最佳实践(二)

Maven

好的选择:Gradle。

Maven让然是构建,打包并运行你的测试的标准工具。不过还有其它可选项,比如Gradle,但是它们并不像Maven那样为人们所接受。如果你是Maven新手,你应该通过示例来上手Maven.

我喜欢能有一个根POM,里面有你想要使用的所有的外部依赖包。它看起来像是这样的。这个根POM只有一个外部依赖,而如果你自己的项目足够大,就会有很多个。你的根POM自身可能也是一个项目:收到版本控制中并且像其它的 Java 项目那样进行发布。

如果你想过要为你的根POM标记出的每一个外部依赖的变化太多了,你不必浪费一个星期去跟踪调试多个项目的依赖错误。

你的所有的Maven项目都将包含你的根 POM,以及他所有的版本信息。这样,你就能得到你的公司所选择的每一个外部依赖的版本,以及所有的正确的 Maven 插件。如果你需要拉入外部依赖,就会像下面这样运作:

<dependencies><dependency><groupId>org.third.party</groupId><artifactId>some-artifact</artifactId></dependency></dependencies>

如果你想要外部的依赖,那就应该被每一个独立的项目部分管理起来。否则就很难保持根 POM 的有序性。

依赖收敛

Java最好的部分就是大量的第三方库能帮助你做任何事情。基本上每一个 API 或者工具包都有一个Java SDK,并且很容易用Maven获取。

而那些Java库自身则还要依赖于其它的特定版本的库. 如果你引入了够多的库,就会发生版本冲突, 那会像下面这样:

Foo library depends on Bar library v1.0Widget library depends on Bar library v0.9

哪个版本会引入到你的项目中呢?

使用Maven的依赖收敛插件, 构建就会在你的依赖没有使用相同的版本时报错。之后要解决冲突,你可以有两种选择:

在你的dependencyManagement一节为Bar明确挑选一个版本

将Bar从Foo或者Widget中排除出去

选择哪种方案要视你的情形而定:如果你想要跟踪一个项目的版本,那么就用排除的方案。另外一方面,如果你想要明确的指定它,你就可以挑选一个版本,虽然你将需要在更新其它依赖的同时对它进行更新。

持续集成

显然你需要一些持续集成的服务来让你连续不断地建立你的SNAPSHOT(快照)版本和建立基于 git标签的tag。

Jenkins和Travis-CI是自然的选择。

代码覆盖率测试是有用的,并且 Cobertura 有一个很好的 Maven 插件 并对CI提供支持。还有其他 Java 的代码覆盖率工具,但我是使用Cobertura 的。

Maven资源库

你需要一个地方放置你的jar包,war包和ear包 , 因此你需要一个资源库。

通常的选择是Artifactory和Nexus。都很有用,且都有他们自己的优劣势。

你应该有一个自己安装的 Artifactory/Nexus 并且上面有你的依赖的镜像。这样你的工作就不会因为在线的 Maven 资源库挂掉而中断。

配置管理

现在你已经把代码编译好了,资源库也设置好了,要做的就是让你开发环境的代码最后放到生产上去。在这儿不要偷懒,因为自动化一些东西将会给你带来长久的好处。

Chef, Puppet, 和 Ansible 是典型的选择。我也编写过一个叫做Squadron的可选方案,当然我认为你应该拿来看看,因为它比其他选择更容易上手。

不管你选择的哪个工具,都不要忘了对你的部署操作进行自动化。

可能 Java 最棒的特性就是它所拥有的大量的库 . 这里是可能大部分人都会用到的一些库的集合.

缺少的功能特性

Java的标准处曾今踏出了了不起的一步,现在看起来则缺少了几个关键的功能特性。

Apache Commons

Apache Commons 项目有一堆实用的库。

Commons Codec 有许多针对 和 16 进制字符串的编码/解码方法。你就不要再浪费时间再去重新编写他们了。

Commons Lang 是针对 String 的创建和操作,字符集以及一堆实用工具方法的库。

Commons IO 拥有你可以想象得到的所有文件相关的方法。它有 FileUtils.copyDirectory,FileUtils.writeStringToFile,IOUtils.readLines 以及更多的东西。

Guava

Guava 是 Google 的优秀的补充Java所缺的库。几乎很难提交我所喜欢的有关于这个库的所每个功能,但我会试试。

Cache 是获取一个内存缓存的简单方法,可以被用来缓存网络访问,磁盘访问,记忆函数或者任何实在的数据。只要实现一个 CacheBuilder 就能告诉 Guava 如何去构建你的缓存,一切尽在你的掌握之中 !

Immutable 集合。有一堆这样东西 : ImmutableMap,ImmutableList, 或者如果那是你的风格的话,就还有 ImmutableSortedMultiSet .

我也喜欢用 Guava 的方式编写不可变的集合:

// Instead offinal Map<String, Widget> map = new HashMap<String, Widget>();// You can usefinal Map<String, Widget> map = Maps.newHashMap();

还有针对 Lists, Maps, Sets 以及更多集合的静态类。 他们更清晰和可读。

如果你还在 Java 6 或者 7 的坑里面, 你可以使用 Collections2 类, 它拥有像 filter 和 transform 这样的方法. 能让你在没有 Java 8 对流的支持下写出流畅的代码。

Guava 也有一些简单的东西, 比如 Joiner 能用分隔符将字符串连接起来,以及一个通过忽略它们来 处理中断的类.

Gson

Google的Gson 库是一个简单快速的JSON转换库。像下面这样运作:

finalGson gson = new Gson();finalString json = gson.toJson(fooWidget);finalFooWidget newFooWidget = gson.fromJson(json, FooWidget.class);

相当简单且令人愉悦。Gson用户手册 有许多的示例。

Java Tuples

Java经常令我头疼的一点就是他的标准库里面并没有内置元组。幸运的是, Java tuples 项目解决了这个问题。

它易于使用而且表现很棒:

Pair<String, Integer> func(String input) { // something...returnPair.with(stringResult, intResult);} Joda-Time

Joda-Time 是我所使用过的最棒的时间库. 简答,直接,易于测试. 夫复何求?

所以你只要在如果没有使用Java8时使用这个库,因为Java8有了新的 日期时间 库。

Lombok

Lombok 是一个有趣的库。它能通过注解让你减少 Java 所严重遭受的样板式代码。

想要为你的类变量加入设置器和获取器? 简单:

publicclassFoo{ @Getter@Setterprivateint var;}

现在你可以这样做:

final Foo foo = new Foo();foo.setVar(5);

还有 更多的东西。我还没有将 Lombok 用于生产环境,但我迫不及待的想要这么做了。

Play framework

好的选择 : Jersey 或者 Spark

在Java中实现 RESTful web 服务又两个主要的阵营 : JAX-RS 和其余一切。

JAX-RS 是传统的方式。你可以使用诸如Jersey之类的东西来将注解结合接口和实现来组织 web 服务。这里有意思的是你可以简单的从接口类创建出客户端。

Play framework 是 JVM 的 web服务的一个异类:你会有一个路由文件,然后你要编写在这些路由中被引用的类。它实际上是一个完整的 MVC 框架, 但是你可以简单地只把他用于 REST web 服务。

它在 Java 和 Scala 上都能用。它稍有偏向 Scala 优先,不过在Java中也还好.

如果你用过Python中向Flash这样的微型框架, 你就能熟悉 Spark。它在 Java 8 上能运行得很好。

SLF4J

有许多Java日志的解决方案。我喜欢的就是 SLF4J 因为它的极度的可插入性,并且可以同时结合来自不同日志框架的日志. 有没有过一个使用了 java.util.logging, JCL, 以及 log4j 的古怪项目? SLF4J 为你而生。

两页篇幅的操作手册 就是你入门所需要的。

jOOQ

我不想换重量级的 ORM 框架,因为我喜欢 SQL。因此我写了许多 JDBC 模板, 而这样就有点难以维护。 jOOQ 是一个更好的解决方案。

他能让你用 Java 以一种更加类型安全的方式编写SQL:

// Typesafely execute the SQLstatement directly with jOOQResult<Record3<String, String, String>> result = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME) .from(BOOK) .join(AUTHOR) .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID)) .where(BOOK.PUBLISHED_IN.equal(1948)) .fetch();

使用这个和 DAO 模式, 你可以使得访问数据库变得轻而易举。

测试

测试对于你的软件至关重要。这些包能使得测试更简单。

jUnit 4

jUnit 不需要介绍了。它是Java中单元测试的标准工具.

而你可能不会发挥 jUnit 的全部潜能。jUnit 支持 参数化测试,,让你不用编写过多样板代码的 规则,随机测试特定代码的 理论, 以及 假设。

jMock

如果依赖注入那块你弄好了的话,这时候它就能发挥点作用了 : 模拟那些有副作用的代码 (比如同一个REST服务器进行交互) 并且仍然可以对调用它的代码进行断言。

jMock 是标准的Java模拟工具。它看起来像这样:

publicclassFooWidgetTest{ private Mockery context = new Mockery(); @TestpublicvoidbasicTest(){ final FooWidgetDependency dep = context.mock(FooWidgetDependency.class); context.checking(new Expectations() {{ oneOf(dep).call(with(any(String.class))); atLeast(0).of(dep).optionalCall(); }}); final FooWidget foo = new FooWidget(dep); Assert.assertTrue(foo.doThing()); context.assertIsSatisfied(); }}

这里通过 jMock 设置了一个 FooWidgetDependency,然后加入了一个预期( expectation)。我们预期 dep 的 call 方法会使用某个字符串被调用一次并且 dep 的 optionalCall 方法会被调用0到多次。

如果你要一次又一次设置相同的依赖,你可能应该将那些放到一个 测试夹具(est fixture)中,并将 assertIsSatisfied 放到一个 @After 夹具中。

AssertJ

你曾经用 jUnit 这样做过吗?

finalList<String> result = some.testMethod(); assertEquals(4, result.size()); assertTrue(result.contains("some result")); assertTrue(result.contains("some other result")); assertFalse(result.contains("shouldn't be here"));

这都是烦人的样板代码。 AssertJ 会把这些都干掉。你可以将同样的代码转换成这样:

assertThat(some.testMethod()).hasSize(4) .contains("some result", "some other result") .doesNotContain("shouldn't be here");

这样流畅的接口让你的测试更加可读. 夫复何求?

工具 IntelliJ IDEA

好的选择: Eclipse 和 Netbeans

最好的java ide是 IntelliJ IDEA。 它有大量超赞的功能特性,并且真正让开发 Java 相关的所有细节都暴露无遗。自动补全很棒, 检查也是顶尖的,还有重构工具真的很有帮助。

免费的社区版本对我而言已经很好的,而旗舰版本则还有许多很棒的功能,比如数据库工具,对 Spring Framework 和 Chronon 的支持。

Chronon

我最喜爱的 GDB 7 的一个功能就是调试的时候可以倒着走。这在你获取到旗舰版本并且使用了 Chronon IntelliJ 插件 时是可能的。

你可以获取到变量的历史,后退,方法的历史以及更多其它的东西。初次使用会有点点怪,但它能帮助你解决一些非常复杂的问题,诸如此类的海森堡 bug。

JRebel

持续集成常常是软件即服务产品的目标。如果你不想等待编译构建结束就看到代码变化所产生的效果呢?

那正是 JRebel 所要做的。一旦你把你的服务器挂到了你的 JRebel 客户端,你就可以实时看见服务器上的变化. 当你想要快速地进行试验时这能节省大量的时间。

检查框架(Checker Framework)

Java的类型系统很不咋地. 它不能区分字符串和实际上是正则表达式的字符串,也没有做 坏点检查。不过, Checker Framework 能做到并且能做到更多。

它使用像 @Nullable 这样的注解来检查类型. 你甚至可以 自己定义注解 来是的静态分析如虎添翼。

Eclipse 内存分析器

即使是在Java中,内存也会发生泄漏。幸运的是,有针对这个问题的工具。我用过的最好的解决这些问题的工具就是 Eclipse 内存分析器。它能获取到堆栈,让你可以找出问题何在。

        学习Java,就来中软卓越!

中软卓越是中软国际有限公司投资的大型人才服务机构,是中软国际人才战略的核心组成部分之一,承担集团发展过程中人才储备和培养的任务,是软件及外包业务快速发展的重要人才支撑平台,是集团保持高速增长动力之一。

中软国际教育集团专注IT教育36年,一直秉承“用良心做教育”的理念,是中国移动互联网研发人才一体化服务的开拓者,全力打造移动互联网研发人才服务优质平台。

公司总部位于武汉,目前已在深圳、上海、郑州、广州、大连、武汉、成都、西安、杭州、重庆、长沙、合肥、无锡、南宁、厦门、南京、南昌等全国22个省成立了60多家分公司。拥有全国的移动互联网教学就业保障团队,做到了毕业学员业内高薪水,成为学员信赖的IT培训机构。

营业执照 版权所有©Copyright 2008-2017,武汉中软卓越科技有限公司 , All Rights Reserved. ICP备案号:15018648号-1

sitemap | 来校路线 | 分类导航 | 关于我们