做爲一名全乾打字員,幹活時常常會被要求使用各類各樣的語言去實現各類各樣的需求,來回切換起來寫的代碼就會或多或少有點不規範。今天咱們以JAVA爲例,講講在代碼中,咱們須要注意的某些規範。(本文標準依賴於阿里巴巴的JAVA開發代碼規範)java
如下舉出本猿在工做中經常出現的問題,包括但不只限於:安全
在 if/else/for/while/do
語句中必須使用大括號,即便只有一行代碼,避免使用下面的形式:多線程
if(condition) statements;
不少童鞋喜歡使用 Apache Beanutils
進行屬性的copy, Apache BeanUtils
性能較差,咱們應該儘可能避免使用,可使用其餘方案好比 Spring BeanUtils
, Cglib BeanCopier
。併發
TestObject a = new TestObject(); TestObject b = new TestObject(); a.setX(b.getX()); a.setY(b.getY());
全部的覆寫方法,都必需要加上 @Override
註解。app
方法名、參數名、成員變量、局部變量都應該統一使用 lowerCamelCase
,類名使用 UpperCamelCase
風格,聽從駝峯命名的標準,儘可能避免如 _
-
等字符鏈接,但如下情形例外:(領域模型的相關命名)DO / BO / DTO / VO / DAO。另外,類都應該加上建立者的信息,方法名也應該加上對應的參數及用途說明。dom
常量命名應該所有大寫,但此間使用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。ide
首先 Random
示例包括 java.util.Random
或者 Math.random()
,咱們應該避免其被多線程使用,雖然共享該實例是線程安全的,但會因競爭統一 seed
致使性能降低。高併發
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build(); ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); singleThreadPool.execute(()-> System.out.println(Thread.currentThread().getName())); singleThreadPool.shutdown();
+字符串拼接性能
在循環體內,咱們應當使用 StringBuilder
的 append
方法進行字符串的鏈接。ui
反例: String result; for (String string : tagNameList) { result = result + string; } 正例: StringBuilder stringBuilder = new StringBuilder(); for (String string : tagNameList) { stringBuilder.append(string); } String result = stringBuilder.toString();
不少人喜歡使用下面的代碼進行 equals
判斷是否爲某個值:
public static final String type = "FOOD"; if(Object.equals(type)){ //do something }
對象中的equals很容易拋空指針異常,因此咱們應該儘可能使用常量或者肯定有值的對象來調用equals。
public void f(String str){ String inner = "hi"; if(inner.equals(str)){ System.out.println("hello world"); } }
咱們每每在集合初始化的時候忘記指定集合的初始值大小,在高併發的狀況下,這樣極可能會形成內存的使用不當引發一系列的問題。因此在使用諸如 HashMap
的時候儘可能指定初始值的大小。
反例: Map<String, String> map = new HashMap<String, String>(); 正例: Map<String, String> map = new HashMap<String, String>(16);
方法內部應當使用單行註釋,在被註釋語句的上方另起一行,使用 //
進行註釋,多行註釋則使用 /* */
,強迫症下應注意與代碼對齊。
public void method() { // Put single line comment above code. (Note: align '//' comment with code) int a = 3; /** * Some description about follow code. (Note: align '/**' comment with code) */ int b = 4; }
在每個switch塊內,每個case都必須經過 break/return
來終止或者是註釋說明程序繼續執行到某一個case爲止,而且都應該包含一個 default
語句放在最後,即使沒有代碼。
switch( x ){ case 1 : break ; case 2 : break ; default : }
雖然咱們每每寫出的代碼可能不是很高效、簡潔,可是咱們必定注意代碼的可讀性,畢竟代碼除了機器看以外,也是給人看的。
送福利送福利啦,本猿最近得到了三張 5QB
的抵用卷,本着蚊子再小也是肉的原則,把它送給在公衆號上留言的前三位童鞋,留言的前三位童鞋看到後記得在後臺留下QQ號聯繫打字員大大領取福利喲~