最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java編程中的一些常見(jiàn)問(wèn)題匯總

 更新時(shí)間:2014年09月26日 10:13:31   投稿:junjie  
這篇文章主要介紹了Java編程中的一些常見(jiàn)問(wèn)題匯總,本文總結(jié)的都是一些Java代碼中比較典型的錯(cuò)誤,需要的朋友可以參考下

本文列舉了我在周?chē)碌腏ava代碼中看到的一些比較典型的錯(cuò)誤。顯然,靜態(tài)代碼分析(我們團(tuán)隊(duì)用的是qulice)不可能發(fā)現(xiàn)所有的問(wèn)題,這也是為什么我要在這里列出它們的原因。

如果你覺(jué)得少了什么,請(qǐng)不吝賜教,我會(huì)很樂(lè)意把它們加上。

下面列出的所有這些錯(cuò)誤基本都與面向?qū)ο缶幊逃嘘P(guān),尤其是Java的OOP。

類(lèi)名

讀下這篇短文“什么是對(duì)象”。類(lèi)應(yīng)該是真實(shí)生活中的一個(gè)抽象實(shí)體,而不是什么“validators”,“controller”, “managers”這些東西。如果你的類(lèi)名以”er”結(jié)尾的話(huà)——那它就是個(gè)糟糕的設(shè)計(jì)。

當(dāng)然了,工具類(lèi)也是反模式,比如說(shuō)Apache的StringUtils, FileUtils, 以及IOUtils。上面這些都是糟糕設(shè)計(jì)的代表。延伸閱讀:OOP中工具類(lèi)的替代方案。

當(dāng)然,不要使用前綴或者后綴來(lái)區(qū)分類(lèi)和接口。比方說(shuō),這些名字就是錯(cuò)誤的:IRecord, IfaceEmployee, 或者RecordInterface。通常來(lái)說(shuō),接口名應(yīng)該是真實(shí)生活中的實(shí)體的名字,類(lèi)名應(yīng)該可以說(shuō)明它的實(shí)現(xiàn)細(xì)節(jié)。如果這個(gè)實(shí)現(xiàn)沒(méi)有什么特別可說(shuō)明的,可以把它叫作Default, Simple或者類(lèi)似的什么。比如說(shuō):

復(fù)制代碼 代碼如下:

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

方法名

方法可以返回值也可以返回void。如果方法返回值的話(huà),它的名字應(yīng)該能說(shuō)明它返回了什么,比如說(shuō)(永遠(yuǎn)也不要使用get前綴):

復(fù)制代碼 代碼如下:

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

如果它返回void,那么它的名字應(yīng)該要說(shuō)明它做了什么。比如:

復(fù)制代碼 代碼如下:

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

剛才提到的這些規(guī)則只有一個(gè)例外——JUnit的test方法不算。下面將會(huì)說(shuō)到這個(gè)。

test方法的名字

在JUnit的測(cè)試用例中,方法名應(yīng)該是沒(méi)有空格的英文語(yǔ)句。用一個(gè)例子來(lái)說(shuō)明會(huì)更清楚一些:

復(fù)制代碼 代碼如下:

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

你的JavaDoc里的第一句話(huà)的開(kāi)頭應(yīng)該是你要測(cè)試的那個(gè)類(lèi)的名字,然后是一個(gè)can。因此,你的第一句話(huà)應(yīng)該是類(lèi)似于“somebody can do something”。

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

請(qǐng)注意test方法的名字是不以can開(kāi)頭的。只有JavaDoc里的的注釋會(huì)以can開(kāi)頭。除此之外,方法名不應(yīng)該以動(dòng)詞開(kāi)頭。

實(shí)踐中最好將測(cè)試方法聲明為拋出Exception的。

變量名

避免組合的變量名,比如說(shuō)timeOfDay, firstItem,或者h(yuǎn)ttpRequest。類(lèi)變量及方法內(nèi)的變量都是如此。變量名應(yīng)該足夠長(zhǎng),避免在它的可見(jiàn)作用域內(nèi)產(chǎn)生歧義,但是如果可以的話(huà)也不要太長(zhǎng)。名字應(yīng)該是單數(shù)或復(fù)數(shù)形式的名詞,或者是一個(gè)適當(dāng)?shù)目s寫(xiě)。比如:

復(fù)制代碼 代碼如下:

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

有的時(shí)候,如果構(gòu)造方法要將入?yún)⒈4娴揭粋€(gè)新初始化的對(duì)象中的時(shí)候,它的參數(shù)和類(lèi)屬性的名字可能會(huì)沖突。這種情況,我建議是去掉元音,使用縮寫(xiě)。

示例:

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

File file;
User user;
Branch branch;

然而,基礎(chǔ)類(lèi)型的話(huà),永遠(yuǎn)不要這么做,比如Integer number或者String string。

如果存在多個(gè)不同性質(zhì)的變量的話(huà),可以考慮下使用形容詞。比如:

復(fù)制代碼 代碼如下:

String contact(String left, String right);

構(gòu)造方法

不考慮異常的話(huà),應(yīng)該只有一個(gè)構(gòu)造方法用來(lái)將數(shù)據(jù)存儲(chǔ)到對(duì)象變量中。其它構(gòu)造方法則使用不同的參數(shù)來(lái)調(diào)用這個(gè)構(gòu)造方法。比如說(shuō):

復(fù)制代碼 代碼如下:

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

一次性變量

無(wú)論如何都應(yīng)該避免使用一次性變量。這里我所說(shuō)的“一次性“指的是只使用一次的變量。比如下面這個(gè):

復(fù)制代碼 代碼如下:

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

上述的變量只會(huì)使用一次,因此這段代碼可以重構(gòu)成這樣:
復(fù)制代碼 代碼如下:

return new File("data.txt");

有的時(shí)候,比較罕見(jiàn)的情況中——主要是為了格式更好看些——可能會(huì)用到一次性變量。然而,還是應(yīng)當(dāng)盡量避免這種情況。

異常

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

不要使用異常來(lái)進(jìn)行流程控制。比方說(shuō)下面這段代碼就是錯(cuò)誤的:

復(fù)制代碼 代碼如下:

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

那如果IOException提示“磁盤(pán)已滿(mǎn)”的話(huà)該怎么辦?你還會(huì)認(rèn)為這個(gè)文件大小為0,然后繼續(xù)往下處理?

縮進(jìn)

關(guān)于縮進(jìn),主要的規(guī)則就是左括號(hào)要么在該行的末尾,要么就在同一行上閉合(對(duì)于右括號(hào)來(lái)說(shuō)則相反)。比如說(shuō),下面這個(gè)就不正確,因?yàn)榈谝粋€(gè)左括號(hào)沒(méi)有在同一行上閉合,而它后面還有別的字符。第二個(gè)括號(hào)也有問(wèn)題,因?yàn)樗懊嬗凶址?,但?duì)應(yīng)的開(kāi)括號(hào)又沒(méi)在同一行上:

復(fù)制代碼 代碼如下:

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

正確的縮進(jìn)應(yīng)該是這樣的:
復(fù)制代碼 代碼如下:

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

關(guān)于縮進(jìn),第二條重要的規(guī)則就是同時(shí)一行中應(yīng)該盡量多寫(xiě)一些——上限是80個(gè)字符。上面的那個(gè)例子并不滿(mǎn)足這點(diǎn),它還可以收縮一下:
復(fù)制代碼 代碼如下:

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

多余的常量

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

復(fù)制代碼 代碼如下:

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

另一個(gè)常見(jiàn)的錯(cuò)誤就是在單元測(cè)試中使用常量來(lái)避免測(cè)試方法中出現(xiàn)冗余的字符串或者數(shù)值的字面量。不要這么做!每個(gè)測(cè)試方法都應(yīng)該有自己專(zhuān)屬的輸入值。

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

測(cè)試數(shù)據(jù)耦合

下面是測(cè)試方法中數(shù)據(jù)耦合的一個(gè)例子:

復(fù)制代碼 代碼如下:

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

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

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

相關(guān)文章

  • Java中SpringBoot的@Transactional原理

    Java中SpringBoot的@Transactional原理

    這篇文章主要介紹了Java中SpringBoot的@Transactional原理,面向元數(shù)據(jù)遍歷已經(jīng)成為越來(lái)越多開(kāi)發(fā)者的偏好,因此原理從Springboot的EnableTransactionManagement注解說(shuō)起,需要的朋友可以參考下
    2023-07-07
  • Java 注解學(xué)習(xí)筆記

    Java 注解學(xué)習(xí)筆記

    一直都在使用注解,但是一直都沒(méi)有用的很明白,后來(lái)被逼的發(fā)現(xiàn)不搞明白真的就沒(méi)有辦法愉快的寫(xiě)代碼了,所以,這篇《Java中的注解學(xué)習(xí)筆記》就呼之欲出了
    2020-10-10
  • IDEA如何實(shí)現(xiàn)顯示類(lèi)的所有方法

    IDEA如何實(shí)現(xiàn)顯示類(lèi)的所有方法

    這篇文章主要介紹了IDEA如何顯示類(lèi)的所有方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • SpringBoot?錯(cuò)誤頁(yè)面跳轉(zhuǎn)方式

    SpringBoot?錯(cuò)誤頁(yè)面跳轉(zhuǎn)方式

    這篇文章主要介紹了SpringBoot?錯(cuò)誤頁(yè)面跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 新手小白學(xué)JAVA IDEA下載使用手冊(cè)全集

    新手小白學(xué)JAVA IDEA下載使用手冊(cè)全集

    IDEA的每一個(gè)方面都是為了最大限度地提高開(kāi)發(fā)人員的工作效率而設(shè)計(jì)的,它的智能編碼輔助和人機(jī)工程學(xué)設(shè)計(jì)會(huì)讓開(kāi)發(fā)過(guò)程變得愉悅且高效,今天給大家分享新手小白學(xué)JAVA IDEA下載使用手冊(cè)全集,對(duì)idea新手使用相關(guān)知識(shí)感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2021-05-05
  • 淺談servlet與jsp的關(guān)系

    淺談servlet與jsp的關(guān)系

    本文主要介紹了servlet與jsp的相關(guān)知識(shí),并總結(jié)出servlet與jsp之間的關(guān)系,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)使用操作(一對(duì)一、一對(duì)多、多對(duì)多)

    Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)使用操作(一對(duì)一、一對(duì)多、多對(duì)多)

    這篇文章主要介紹了Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)操作(一對(duì)一、一對(duì)多、多對(duì)多),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 5分鐘搞定java單例模式

    5分鐘搞定java單例模式

    單例模式(Singleton?Pattern)是?Java?中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,本文給大家介紹下java單例模式的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-03-03
  • java面試題之try中含return語(yǔ)句時(shí)代碼的執(zhí)行順序詳解

    java面試題之try中含return語(yǔ)句時(shí)代碼的執(zhí)行順序詳解

    這篇文章主要介紹了關(guān)于java中的一道面試題,這套題就是在try中含return語(yǔ)句時(shí)代碼的執(zhí)行順序,這個(gè)問(wèn)題看似簡(jiǎn)單,卻暗藏殺機(jī)??!文中通過(guò)一個(gè)個(gè)例子詳細(xì)介紹了其中玄機(jī),需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-04-04
  • 詳解Java設(shè)計(jì)模式編程中命令模式的項(xiàng)目結(jié)構(gòu)實(shí)現(xiàn)

    詳解Java設(shè)計(jì)模式編程中命令模式的項(xiàng)目結(jié)構(gòu)實(shí)現(xiàn)

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中命令模式的項(xiàng)目結(jié)構(gòu)實(shí)現(xiàn),命令模式將請(qǐng)求與執(zhí)行分離,可以多個(gè)命令接口的實(shí)現(xiàn)類(lèi),隱藏真實(shí)的被調(diào)用方,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

化德县| 应城市| 阜平县| 天峻县| 瓮安县| 赣榆县| 康平县| 嘉义市| 鄂州市| 淮南市| 民权县| 蓬溪县| 江北区| 迭部县| 灵武市| 葵青区| 柳河县| 黄山市| 平罗县| 东乌珠穆沁旗| 敦煌市| 确山县| 中西区| 临城县| 五峰| 乌鲁木齐市| 潮安县| 简阳市| 三门县| 日土县| 博爱县| 阳西县| 临安市| 冕宁县| 双流县| 乌拉特中旗| 闽清县| 察雅县| 云林县| 清河县| 慈溪市|