首页 存档 技术 查看内容

Java的最佳实践

2018-3-30 13:00 |来自: 互联网 298 0

摘要: (点击上方蓝字,可快速关注我们) 英文:seancassidy 译文:开源中国社区,leoxu译 链接:http://www.oschina.net/translate/better-java Java 是在世界各地最流行的编程语言之一, 但是看起来没人喜欢使用它。而 ...

(点击上方蓝字,可快速关注我们)


英文:seancassidy

译文:开源中国社区,leoxu译

链接:http://www.oschina.net/translate/better-java


Java 是在世界各地最流行的编程语言之一, 但是看起来没人喜欢使用它。而 Java 事实上还算是一门不错的语言,随着 Java 8 最近的问世,我决定编制一个库,实践和工具的清单,汇集 Java 的一些最佳实践。


本文被放到了 Github 上。你可以随意地提交贡献,并加入自己的有关 Java 方面的建议和最佳实践。


  • 风格

    • Javadoc

    • 构建器模式

    • 结构

    • 依赖注入

    • 避免空值

    • 默认不可变更

    • 避免大量的工具类

    • 格式化

  • 发布

    • 依赖收敛

    • 框架

    • Maven

    • 持续集成

    • Maven 资源库

    • 配置管理

    • jUnit 4

    • jMock

    • AssertJ

    • Apache Commons

    • Guava

    • Gson

    • Java Tuples

    • Joda-Time

    • Lombok

    • Play framework

    • SLF4J

    • jOOQ

    • Missing Features

    • Testing

  • 工具

    • Chronon

    • IntelliJ IDEA

    • JRebel

    • Checker 框架

    • Eclipse 内存分析器

  • 资源

    • 书籍

    • 播客


风格


通常,我们会以一种非常详细繁杂的企业级 JavaBean 的风格进行 Java 代码的编写。新的风格则更加清晰,正确,且看上去也更加的简单。


结构


作为程序员的我们要做的最简单的事情之一,就是传递数据。一般的方式就是定义一个 JavaBean:


public class DataHolder {

private String data;

public DataHolder() {

}

public void setData(String data) {

this.data = data;

}

public String getData() {


return this.data;

}}


你可以在对象中创建一个能帮助你构建出这个对象的子类。它使用了可变语句,但是一旦你调用了build,它就会提供给你一个不可变的对象。这有点麻烦,并且也有点浪费。尽管你的 IDE 也能自动的生成这样的代码,但那也是种浪费。所以,别这么做。


相反,我更愿意选择编写类 C 的结构体风格的类,类里面只容纳数据:

public class DataHolder {

public final String data;

public DataHolder(String data) {

this.data = data;

}}

这样就在代码行数上减少了一半。此外,这个类是不能被修改的,除非你对它进行了扩展,因此我们可以更加容易的理解它,因为我们明白它不可以被修改。


如果你要保存像 Map 或者 List 这样容易被修改的对象,就应该使用 ImmutableMap 和 ImmutableList,这一点会在不可变性质的那一节被讲到。


Builder 模式


如果你有一个相当复杂的对象想要去为其构建一个结构,可以考虑使用 Builder 模式。



想象一下我们要有一个更加复杂的 DataHolder。针对它的构建器看起来可能像是下面这样:

public class ComplicatedDataHolder {

public final String data;

public final int num;

// lots more fields and a constructor


public static class Builder {

private String data;

private int num;


public Builder data(String data) {

this.data = data;

return this;

}


public Builder num(int num) {

this.num = num;

return this;

}


public ComplicatedDataHolder build() {

return new ComplicatedDataHolder(data, num); // etc

}

}}

然后这样去使用它:

final ComplicatedDataHolder cdh = new ComplicatedDataHolder.Builder()

.data("set this")

.num(523)

.build();

使用 Spring 的好的选择就是 Google 和 Square 的 Dagger 库以及Google 的 Guice。他们不使用 Spring 的 XML 配置文件格式,而是将依赖逻辑放到注解和代码中。还有其它关于构建器的更好的例子 ,而这里提供给你浅尝辄止。这样做最终会得到许多的我们努力去避免的样板式代码,不过这也让你得到了不可变的对象和一个非常流畅的接口。


依赖注入


这是更偏向软件工程而不是 Java 的一节。编写可测试软件的最佳方式之一就是使用依赖注入(DI)。因为 Java 非常鼓励 OO 设计,为了创造出可测试的软件,你需要使用DI。



在 Java 中,一般使用 Spring 框架 的 DI 实现。它同时支持基于代码的装配和基于 XML 配置的装配。 如果你使用的是 XML 配置,因为其基于 XML 的配置, 不去过分使用 Spring 这一点很重要。XML 中绝对不能有任何逻辑或者控制结构,只能用来注入依赖。


避免空值


尽你所能避免空值。如果你可以返回一个空的集合,就不要返回一个空值。如果你要使用空值,就考虑使用 @Nullable 注解。IntelliJ IDEA 内置有对于 @Nullable 注解的支持。



如果你使用的是 Java 8,就可以利用其优秀的新的 Optional 类型。如果一个可能存在也可能不存在,那就像下面这样把它封装到一个 Optional 类中:

public class FooWidget {

private final String data;

private final Optional

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部