如何寫出更好的Java代碼(2)

發表于:2014-05-27來源:不詳作者:不詳點擊數: 標簽:
還有一個不錯的方式是使用Dagger庫以及Google的Guice。它們并沒有使用Spring的XML配置文件的格式,而是將注入的邏輯放到了注解和代碼里。 避免null值 如果有

  還有一個不錯的方式是使用Dagger庫以及Google的Guice。它們并沒有使用Spring的XML配置文件的格式,而是將注入的邏輯放到了注解和代碼里。

  避免null值

  如果有可能的話盡量避免使用null值。你可以返回一個空的集合,但不要返回null集合。如果你準備使用null的話,考慮一下@Nullable注解。IntelliJ IDEA對于@Nullable注解有內建的支持。

  如果你使用的是Java 8的話,可以考慮下新的Optional類型。如果一個值可能存在也可能不存在,把它封裝到Optional類里面,就像這樣:

  public class FooWidget {

  private final String data;

  private final Optional bar;

  public FooWidget(String data) {

  this(data, Optional.empty());

  }

  public FooWidget(String data, Optional bar) {

  this.data = data;

  this.bar = bar;

  }

  public Optional getBar() {

  return bar;

  }

  }

  現在問題就清楚了,data是不會為null的,而bar可能為空。Optional類有一些像isPresent這樣的方法,這讓它感覺跟檢查null沒什么區別。不過有了它你可以寫出這樣的語句:

  final Optional fooWidget = maybeGetFooWidget();

  final Baz baz = fooWidget.flatMap(FooWidget::getBar)

  .flatMap(BarWidget::getBaz)

  .orElse(defaultBaz);

  這比使用if來檢查null好多了。唯一的缺點就是標準類庫中對Optional的支持并不是很好,因此你還是需要對null進行檢查的。

  不可變

  變量,類,集合,這些都應該是不可變的,除非你有更好的理由它們的確需要進行修改。

  變量可以通過final來設置成不可變的:

  final FooWidget fooWidget;

  if (condition()) {

  fooWidget = getWidget();

  } else {

  try {

  fooWidget = cachedFooWidget.get();

  } catch (CachingException e) {

  log.error("Couldn't get cached value", e);

  throw e;

  }

  }

  // fooWidget is guaranteed to be set here

  現在你可以確認fooWidget不會不小心被重新賦值了。final關鍵字可以和if/else塊以及try/catch塊配合使用。當然了,如果fooWidget對象不是不可變的,你也可以很容易地對它進行修改。

  有可能的話,集合都應該盡量使用Guava的ImmutableMap, ImmutableList, or ImmutableSet類。這些類都有自己的構造器,你可以動態的創建它們,然后將它們設置成不可變的,。

  要使一個類不可變,你可以將它的字段聲明成不可變的(設置成final)。你也可以把類自身也設置成final的這樣它就不能被擴展并且修改了,當然這是可選的。

  避免大量的工具類

  如果你發現自己添加了許多方法到一個Util類里,你要注意了。

  public class MiscUtil {

  public static String frobnicateString(String base, int times) {

  // ... etc

  }

  public static void throwIfCondition(boolean condition, String msg) {

  // ... etc

  }

  }

  這些類乍一看挺吸引人的,因為它們里面的這些方法不屬于任何一個地方。因此你以代碼重用之名將它們全都扔到這里了。

  這么解決問題結果更糟。把它們放回它們原本屬于的地方吧,如果你確實有一些類似的常用方法,考慮下Java 8里接口的默認方法。并且由于它們是接口,你可以實現多個方法。

  public interface Thrower {

  public void throwIfCondition(boolean condition, String msg) {

  // ...

  }

  public void throwAorB(Throwable a, Throwable b, boolean throwA) {

  // ...

  }

  }

  這樣需要使用它的類只需簡單的實現下這個接口就可以了。

  格式

  格式遠比許多程序員相像的要重要的多。一致的格式說明你關注自己的代碼或者對別人有所幫助?是的。不過你先不要著急為了讓代碼整齊點而浪費一整天的時間在那給if塊加空格了。

  如果你確實需要一份代碼格式規范,我強烈推薦Google的Java風格指南。這份指南最精彩的部分就是編程實踐這節了。非常值得一讀。

  文檔

  面向用戶的代碼編寫下文檔還是很重要的。這意味著你需要提供一些使用的示例,同時你的變量方法和類名都應該有適當的描述信息。

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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97