早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的。中午雖然睡了半個小時,可是依然沒有緩過來。整個下午都在混沌中....不過今天下載了一款手游——《劍俠情緣》,感覺不錯,喜歡這種類型的游戲。
今天主要的工作還是做業務需求,不過下午狀態不好,看了下《Effective java》,正好重構了下代碼。
effective java 通過函數來作為策略
通過函數作為策略有兩個要注意的地方:
- 使用接口作為策略傳入
- 如果長期調用,應該設置為靜態內部類,避免頻繁創建過多的匿名對象
下面舉個簡單的例子,針對Engineer類提供不同的策略做排序,比如按照年齡或者按照員工級別:
class Engineer{
private String name;
private int age;
private int level;
public Engineer(String name,int age,int level) {
this.name = name;
this.age = age;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
public class Strategy {
public static final Comparator<Engineer> AGE_ORDER = new AgeComparator();
public static final Comparator<Engineer> LEVEL_ORDER = new LevelComparator();
private static class AgeComparator implements Comparator<Engineer>{
@Override
public int compare(Engineer e1, Engineer e2) {
return e1.getAge()-e2.getAge();
}
}
private static class LevelComparator implements Comparator<Engineer>{
@Override
public int compare(Engineer e1, Engineer e2) {
return e1.getLevel()-e2.getLevel();
}
}
public static void main(String[] args) {
List<Engineer> el = new ArrayList<>();
el.add(new Engineer("zhangsan", 26, 3));
el.add(new Engineer("lisi", 30, 2));
el.add(new Engineer("wangwu", 28, 1));
Collections.sort(el,AGE_ORDER);
System.out.println(JSON.toJSON(el));
Collections.sort(el,LEVEL_ORDER);
System.out.println(JSON.toJSON(el));
}
}
在上面的例子中,采用靜態成員變量聲明,可以在多次使用的時候節省創建對象的成本。而且靜態成員在堆內存的分配上也更簡單,不會每次都創建新的對象。
在真實的場景中,是在某個請求方法里面,返回一個List對象,需要對它按照日期排序。如果是普通的Collections.sort(list,new Comparator<xx>{})
這種方式,會在每次返回結果的時候,都創建一個匿名類,很顯然會浪費不少內存空間,增加垃圾回收的壓力。使用靜態成員變量的方式,可以減少這種不必要的浪費。
List<?>與List
由於在1.5之前的版本,java是沒有泛型概念的。因此在引入泛型后,需要考慮到以前代碼的移植。
沒有泛型的時候,如果使用List,可以往里面插入任意類型的值。但是在取得時候,如果類型不對就有問題了:
List list = new ArrayList();
list.add(1);
String list0 = list.get(0);//出錯
為了避免這種問題,1.5引入泛型,這樣一套代碼可以適用於多種類型;還能在編譯器就檢查類型是否一致。
除了這種List<E> xxx
標准的泛型,java還提供了無限制性的泛型:
<?>意思是未知類型,就是不設上下限
<? extend Object>意思是繼承於Object的未知類型
<? super Object>意思是Object的祖先類型
所以,盡量使用標准的格式,在某些情況下已知的一些通配限制,還可以使用<?>號加以限制。
記得最開始自己寫代碼的時候,滿滿的都是黃色標記,師兄就糾正我的做法,讓我把這些警告全都去掉。其實隨時保證沒有警告的代碼,才是最負責的做法。不管是自己屏蔽掉,還是做相應的解決,都好過編譯的時候爆出一大堆警告好。
編譯器警告
Java是一門編譯型的語言,需要經過編譯,變成class字節碼才能執行。但是在編寫泛型相關的代碼時,總是會遇到一些警告。比如參數僅僅聲明為Map,沒有聲明具體內部的內容等等。
在Eclipse中可以通過加入@SuppressWarning
注解來忽略警告,但是不推薦這種做法。除非你對自己的代碼非常自信,保證不會出現其他的類型,而導致ClassCastException。所以盡量在寫代碼的時候不要產生警告,如果想要忽略,盡量考慮清楚入口出口是否不會出現意外。
常用的就是unckecked和rawtypes,一個是不檢查內部變量,一個是不檢查參數類型。
all to suppress all warnings
boxing to suppress warnings relative to boxing/unboxing operations
cast to suppress warnings relative to cast operations
dep-ann to suppress warnings relative to deprecated annotation
deprecation to suppress warnings relative to deprecation
fallthrough to suppress warnings relative to missing breaks in switch statements
finally to suppress warnings relative to finally block that don’t return
hiding to suppress warnings relative to locals that hide variable
incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)
nls to suppress warnings relative to non-nls string literals
null to suppress warnings relative to null analysis
rawtypes to suppress warnings relative to un-specific types when using generics on class params
restriction to suppress warnings relative to usage of discouraged or forbidden references
serial to suppress warnings relative to missing serialVersionUID field for a serializable class
static-access to suppress warnings relative to incorrect static access
synthetic-access to suppress warnings relative to unoptimized access from inner classes
unchecked to suppress warnings relative to unchecked operations
unqualified-field-access to suppress warnings relative to field access unqualified
unused to suppress warnings relative to unused code
什么是同比和環比
做業務需求,還是需要了解些業務知識才行。無論是電商環境,還是傳統企業,環比和同比是最常見的數據分析手段,可以通過對比明顯的看到當前業務的變化趨勢,有利於管理層即使做出調整,那么什么是環比,什么是同比呢?
- 環比就是現在的統計周期和上一個統計周期比較。
- 同比是與歷史時期作比較。
舉個例子:
- 2016年4月和2016年的3月相比,就是環比
- 2016年的10月和2015年的10月相比,就是同比
太業務化的東西,就不說了,免得設計到什么尷尬的信息。
睡覺時間到,養好精神,才能專注...