如何写出更好的Java代码

发表于:2014-05-27来源:不详作者:不详点击数: 标签:
Java是最流行的编程语言之一,但似乎并没有人喜欢使用它。好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面

  Java是最流行的编程语言之一,但似乎并没有人喜欢使用它。好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具。

  这篇文章在GitHub上也有。你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践。

  编码风格

  结构体

  builder模式

  依赖注入

  避免null值

  不可变

  避免过多的工具类

  格式

  文档

  Stream

  部署

  框架

  Maven

  依赖收敛

  持续集成

  Maven仓储

  配置管理

  库

  遗失的特性

  Apache Commons

  Guava

  Gson

  Java Tuples

  Joda-Time

  Lombok

  Play framework

  SLF4J

  jOOQ

  测试

  jUnit 4

  jMock

  AssertJ

  工具

  IntelliJ IDEA

  Chronon

  JRebel

  校验框架

  Eclipse Memory Analyzer

  资源

  书籍

  播客

  编码风格

  传统的Java编码方式是非常啰嗦的企业级JavaBean的风格。新的风格更简洁准确,对眼睛也更好。

  结构体

  我们这些码农干的最简单的事情就是传递数据了。传统的方式就是定义一个JavaBean:

  public class DataHolder {

  private String data;

  public DataHolder() {

  }

  public void setData(String data) {

  this.data = data;

  }

  public String getData() {

  return this.data;

  }

  }

  这不仅拖沓而且浪费。尽管你的IDE可以自动地生成这个,但这还是浪费。因此,不要这么写。

  相反的,我更喜欢C的结构体的风格,写出来的类只是包装数据:

  public class DataHolder {

  public final String data;

  public DataHolder(String data) {

  this.data = data;

  }

  }

  这样写减少了一半的代码。不仅如此,除非你继承它,不然这个类是不可变的,由于它是不可变的,因此推断它的值就简单多了。

  如果你存储的是Map或者List这些可以容易被修改的数据,你可以使用ImmutableMap或者ImmutableList,这个在不可变性这节中会有讨论。

  Builder模式

  如果你有一个相对复杂的对象,可以考虑下Builder模式。

  你在对象里边创建一个子类,用来构造你的这个对象。它使用的是可修改的状态,但一旦你调用了build方法,它会生成一个不可变对象。

  想象一下我们有一个非常复杂的对象DataHolder。它的构造器看起来应该是这样的:

  public class ComplicatedDataHolder {

  public final String data;

  public final int num;

  // lots more fields and a constructor

  public 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();

  关于Builder的使用这里还有些更好的例子,我这里举的例子只是想让你大概感受一下。当然这会产生许多我们希望避免的样板代码,不过好处就是你有了一个不可变对象以及一个连贯接口。

  依赖注入

  这更像是一个软件工程的章节而不是Java的,写出可测的软件的一个最佳方式就是使用依赖注入(Dependency injection,DI)。由于Java强烈鼓励使用面向对象设计 ,因此想写出可测性强的软件,你需要使用DI。

  在Java中,这个通常都是用Spring框架来完成的。它有一个基于XML配置的绑定方式,并且仍然相当流行。重要的一点是你不要因为它的基于XML的配置格式而过度使用它了。在XML中应该没有任何的逻辑和控制结构。它只应该是依赖注入。

原文转自:http://it.deepinmind.com/java/2014/05/21/better-java.html