亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java編程中的一些常見問題匯總

2019-11-26 15:24:19
字體:
來源:轉載
供稿:網友

本文列舉了我在周圍同事的Java代碼中看到的一些比較典型的錯誤。顯然,靜態代碼分析(我們團隊用的是qulice)不可能發現所有的問題,這也是為什么我要在這里列出它們的原因。

如果你覺得少了什么,請不吝賜教,我會很樂意把它們加上。

下面列出的所有這些錯誤基本都與面向對象編程有關,尤其是Java的OOP。

類名

讀下這篇短文“什么是對象”。類應該是真實生活中的一個抽象實體,而不是什么“validators”,“controller”, “managers”這些東西。如果你的類名以”er”結尾的話――那它就是個糟糕的設計。

當然了,工具類也是反模式,比如說Apache的StringUtils, FileUtils, 以及IOUtils。上面這些都是糟糕設計的代表。延伸閱讀:OOP中工具類的替代方案。

當然,不要使用前綴或者后綴來區分類和接口。比方說,這些名字就是錯誤的:IRecord, IfaceEmployee, 或者RecordInterface。通常來說,接口名應該是真實生活中的實體的名字,類名應該可以說明它的實現細節。如果這個實現沒有什么特別可說明的,可以把它叫作Default, Simple或者類似的什么。比如說:

復制代碼 代碼如下:

class SimpleUser implements User {};
class DefaultRecord implements Record {};
class Suffixed implements Name {};
class Validated implements Content {};

方法名

方法可以返回值也可以返回void。如果方法返回值的話,它的名字應該能說明它返回了什么,比如說(永遠也不要使用get前綴):

復制代碼 代碼如下:

boolean isValid(String name);
String content();
int ageOf(File file);

如果它返回void,那么它的名字應該要說明它做了什么。比如:

復制代碼 代碼如下:

void save(File file);
void process(Work work);
void append(File file, String line);

剛才提到的這些規則只有一個例外――JUnit的test方法不算。下面將會說到這個。

test方法的名字

在JUnit的測試用例中,方法名應該是沒有空格的英文語句。用一個例子來說明會更清楚一些:

復制代碼 代碼如下:

/**
 * HttpRequest can return its content in Unicode.
 * @throws Exception If test fails
 */
public void returnsItsContentInUnicode() throws Exception {
}

你的JavaDoc里的第一句話的開頭應該是你要測試的那個類的名字,然后是一個can。因此,你的第一句話應該是類似于“somebody can do something”。

方法名也是一樣的,只是沒有主題而已。如果我在方法名中間加一個主題的話,我就能得到一個完整的句子,正如上面那個例子中那樣:“HttpRequest returns its content in unicode”。

請注意test方法的名字是不以can開頭的。只有JavaDoc里的的注釋會以can開頭。除此之外,方法名不應該以動詞開頭。

實踐中最好將測試方法聲明為拋出Exception的。

變量名

避免組合的變量名,比如說timeOfDay, firstItem,或者httpRequest。類變量及方法內的變量都是如此。變量名應該足夠長,避免在它的可見作用域內產生歧義,但是如果可以的話也不要太長。名字應該是單數或復數形式的名詞,或者是一個適當的縮寫。比如:

復制代碼 代碼如下:

List<String> names;
void sendThroughProxy(File file, Protocol proto);
private File content;
public HttpRequest request;

有的時候,如果構造方法要將入參保存到一個新初始化的對象中的時候,它的參數和類屬性的名字可能會沖突。這種情況,我建議是去掉元音,使用縮寫。

示例:

復制代碼 代碼如下:

public class Message {
  private String recipient;
  public Message(String rcpt) {
    this.recipient = rcpt;
  }
}

很多時候,看一下變量的類名就知道變量該取什么名字了。就用它的小寫形式就好了,像這樣就很靠譜:

復制代碼 代碼如下:

File file;
User user;
Branch branch;

然而,基礎類型的話,永遠不要這么做,比如Integer number或者String string。

如果存在多個不同性質的變量的話,可以考慮下使用形容詞。比如:

復制代碼 代碼如下:

String contact(String left, String right);

構造方法

不考慮異常的話,應該只有一個構造方法用來將數據存儲到對象變量中。其它構造方法則使用不同的參數來調用這個構造方法。比如說:

復制代碼 代碼如下:

public class Server {
  private String address;
  public Server(String uri) {
    this.address = uri;
  }
  public Server(URI uri) {
    this(uri.toString());
  }
}

一次性變量

無論如何都應該避免使用一次性變量。這里我所說的“一次性“指的是只使用一次的變量。比如下面這個:

復制代碼 代碼如下:

String name = "data.txt";
return new File(name);

上述的變量只會使用一次,因此這段代碼可以重構成這樣:
復制代碼 代碼如下:

return new File("data.txt");

有的時候,比較罕見的情況中――主要是為了格式更好看些――可能會用到一次性變量。然而,還是應當盡量避免這種情況。

異常

毋庸贅言,永遠不要自己吞掉異常,而是應該當它盡量往上傳遞。私有方法應該始終把受檢查異常往外面拋。

不要使用異常來進行流程控制。比方說下面這段代碼就是錯誤的:

復制代碼 代碼如下:

int size;
try {
  size = this.fileSize();
} catch (IOException ex) {
  size = 0;
}

那如果IOException提示“磁盤已滿”的話該怎么辦?你還會認為這個文件大小為0,然后繼續往下處理?

縮進

關于縮進,主要的規則就是左括號要么在該行的末尾,要么就在同一行上閉合(對于右括號來說則相反)。比如說,下面這個就不正確,因為第一個左括號沒有在同一行上閉合,而它后面還有別的字符。第二個括號也有問題,因為它前面有字符,但對應的開括號又沒在同一行上:

復制代碼 代碼如下:

final File file = new File(directory,
  "file.txt");

正確的縮進應該是這樣的:
復制代碼 代碼如下:

StringUtils.join(
  Arrays.asList(
    "first line",
    "second line",
    StringUtils.join(
      Arrays.asList("a", "b")
    )
  ),
  "separator"
);

關于縮進,第二條重要的規則就是同時一行中應該盡量多寫一些――上限是80個字符。上面的那個例子并不滿足這點,它還可以收縮一下:
復制代碼 代碼如下:

StringUtils.join(
  Arrays.asList(
    "first line", "second line",
    StringUtils.join(Arrays.asList("a", "b"))
  ),
  "separator"
);

多余的常量

當你希望在類的方法中共享信息的時候,應當使用類常量,這些信息應該是你這個類所特有的。不要把常量當作字符串或數值字面量的替代品來使用――這是非常糟糕的實踐方式,它會對代碼造成污染。常量(正如OOP中的任何對象一樣)應當在真實世界中有它自己的含義??聪逻@些常量在真實生活中的意思是什么:

復制代碼 代碼如下:

class Document {
  private static final String D_LETTER = "D"; // bad practice
  private static final String EXTENSION = ".doc"; // good practice
}

另一個常見的錯誤就是在單元測試中使用常量來避免測試方法中出現冗余的字符串或者數值的字面量。不要這么做!每個測試方法都應該有自己專屬的輸入值。

在每個新的測試方法中使用新的文本或者數值。它們是相互獨立的。那么為什么它們還要共享同樣的輸入常量呢?

測試數據耦合

下面是測試方法中數據耦合的一個例子:

復制代碼 代碼如下:

User user = new User("Jeff");
// maybe some other code here
MatcherAssert.assertThat(user.name(), Matchers.equalTo("Jeff"));

最后一行中,”Jeff”和第一行中的同一個字符串字面值發生了耦合。如果過了幾個月,有人想把第三行這個值換一下,那么他還得花時間找出同一個方法中哪里也使用了這個”Jeff”。

為了避免這種情況,你最好還是引入一個變量。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久精品网站| 91干在线观看| 亚洲黄色www网站| 国产z一区二区三区| 欧美精品第一页在线播放| 91av视频在线免费观看| 亚洲精品v天堂中文字幕| 亚洲成av人片在线观看香蕉| 久久精品国产久精国产一老狼| 日韩av电影手机在线观看| 亚洲一区二区在线播放| 国产中文日韩欧美| 日本中文字幕久久看| 欧美另类第一页| 欧美在线激情网| 成人激情电影一区二区| 精品久久久久久久久久久| 久久天天躁狠狠躁夜夜躁2014| 欧美国产激情18| 亚洲日本成人网| 97久久久免费福利网址| 国产成人综合av| 亚洲精品999| 国产精品电影在线观看| 日本老师69xxx| 亚洲国产精品va在线观看黑人| 2019中文字幕在线观看| 亚洲毛片在线观看| 日韩av免费看网站| 91麻豆桃色免费看| 国内精品久久久久久久久| 国产在线观看91精品一区| 日韩美女中文字幕| 中国日韩欧美久久久久久久久| 欧美成人免费va影院高清| 国产有码在线一区二区视频| 97色在线观看| 欧美一区三区三区高中清蜜桃| 久久久成人的性感天堂| 国产+成+人+亚洲欧洲| 中文在线不卡视频| 日韩中文字幕在线免费观看| 91免费精品视频| 中日韩美女免费视频网址在线观看| 久久久免费电影| 久久69精品久久久久久国产越南| 国产亚洲精品美女久久久久| 欧美性猛交xxxx富婆| 午夜伦理精品一区| 国产精品福利网站| 久久免费视频在线观看| 亚洲精品www久久久久久广东| 伊人久久免费视频| 成人黄色片网站| 96sao精品视频在线观看| 成人黄色午夜影院| 国产精品h片在线播放| 成人妇女免费播放久久久| 日韩网站免费观看| 日韩美女在线观看一区| 国外成人在线视频| 韩国国内大量揄拍精品视频| 亚洲性日韩精品一区二区| 日韩欧美在线视频| 日韩一区二区在线视频| 俺也去精品视频在线观看| 精品久久久久久久久中文字幕| 亚洲成人免费网站| 欧洲日本亚洲国产区| 欧美激情久久久久久| 欧美限制级电影在线观看| 日韩男女性生活视频| 欧美午夜www高清视频| 96精品久久久久中文字幕| 91高潮精品免费porn| 日本成人在线视频网址| 欧美在线观看日本一区| 91久久精品国产91性色| 4438全国亚洲精品在线观看视频| 久久精品2019中文字幕| 欧美日韩中文字幕在线| 国产欧美日韩中文字幕在线| xvideos亚洲| 日本乱人伦a精品| 2020久久国产精品| 欧美日本中文字幕| 欧美在线视频播放| 91深夜福利视频| 国产人妖伪娘一区91| 国内精品久久久久久久久| 国产香蕉一区二区三区在线视频| 欧美久久精品一级黑人c片| 久久精品这里热有精品| 日韩在线视频二区| 色爱精品视频一区| 日韩成人性视频| 自拍偷拍亚洲一区| 97视频在线观看成人| 亚洲天堂av综合网| 精品久久久久久久久中文字幕| 久久精视频免费在线久久完整在线看| 日本午夜在线亚洲.国产| 91在线高清免费观看| 91av在线免费观看| 国产69久久精品成人| 日本视频久久久| 欧美高清在线视频观看不卡| 热99精品里视频精品| 亚洲天堂一区二区三区| 欧美日韩一区二区在线| 日本成熟性欧美| 国产伊人精品在线| 国产精品免费一区二区三区都可以| 久久99久久99精品免观看粉嫩| 久久这里只有精品视频首页| 亚洲色图日韩av| 亚洲欧美国产视频| 另类视频在线观看| 97精品视频在线播放| 日韩人体视频一二区| 欧美一级视频一区二区| 国产一区二区三区视频| 欧美日韩免费区域视频在线观看| 亚洲精品mp4| 亚洲变态欧美另类捆绑| 国产91色在线|免| 国产欧美精品日韩精品| 韩日欧美一区二区| 国产精品普通话| 亚洲成色777777女色窝| 欧美性色xo影院| 国产伦精品一区二区三区精品视频| 国产精品xxxxx| 国产日韩精品在线观看| 一区二区在线视频播放| 国产精自产拍久久久久久蜜| 欧美人与性动交| 日韩高清av一区二区三区| 成人看片人aa| 亚洲人免费视频| 精品无人区太爽高潮在线播放| 亚洲色图13p| 久久福利视频网| 精品激情国产视频| 日韩一级黄色av| 亲子乱一区二区三区电影| 91久久精品日日躁夜夜躁国产| 日韩精品视频中文在线观看| 欧美性20hd另类| 久久精品国产一区二区电影| 亚洲精品资源在线| 国产在线999| 精品久久久久国产| 91在线观看欧美日韩| 欧美电影免费观看高清完整| 亚洲人成毛片在线播放| 最近2019年中文视频免费在线观看| 国产91精品久久久久久| 亚洲精品欧美日韩专区| 国产一区二区三区在线免费观看| 久久久久久久一区二区三区| 亚洲综合视频1区| 欧美精品制服第一页| 精品国产一区二区三区久久久狼|