忙裡偷閒,到了這個時間終於得空寫一篇早想寫的文章。其實本文的標題有些不太准確,C++程序員寫Java代碼不是說就非得轉行寫Java,拋棄C++,而只是多了一個選擇而已。兩種語言各有優勢,這裡我們且不談語言之爭,就假設有朋友需要這樣一種角色轉變,寫了多年的C++,一時間突然有項目需要用Java來寫。
Java語言較C++語言語法上有很多的相似之處,但是本質上是有區別的。一個合格的C++程序員在他寫下每一行代碼的時候心中必然會有整個程序運行起來以後,代碼中的每一個變量是如何存儲的,堆棧是什麼結構的,哪塊的內存如果處理不當會出大麻煩。但是Java程序員就有些不同,由於Java語言規范和Java虛擬機規范是分開的,再加上自動GC,操控性有些差,但是這也不是什麼壞事,畢竟手動管理內存有其復雜性。
個人認為對於C++程序員來說,Java語法完全沒有問題,可以說超過80%的結構都是一樣的,所以這不是問題。但是學會了英語語法你就能過英語六級了麼?就能和老外開會聊天了麼?不一定吧。對了,我們還要學的是方言,慣用法和模式,所謂入鄉隨俗,進了Java的世界我們就要按照Java的規矩來玩。比如對象需要如何創建,兩個對象如何比較,枚舉類型如何使用,泛型代碼如何寫,並發代碼在什麼情況下有哪一種上層建築來實現比較好,什麼時候在代碼中拋出什麼樣的異常,什麼時候使用反射。個人認為一個對技術比較執著的人可能也至少需要3個月的項目磨煉才能出師,當然我說的前提是這個C++工程師已經有了相當的基礎,這樣才能站得一山而望另一山高。
所以個人認為的C++程序員轉Java的捷徑是:學習Java中的慣用法,模式再加上項目磨煉。
另外需要說的對C++程序員的一個優勢,由於主流JVM都是C/C++代碼寫成的,對於喜歡深度游的朋友完全可以庖丁解牛,只要你的調試技術夠,一切盡收眼底,此方法同樣適用於JavaScript,因為V8也是C++寫的..下面寫兩個Java中的慣用法,與大家分享。
慣用法1, Java中用枚舉實現單例模式
public enum AnimalHelperSingleton {
INSTANCE;
private AnimalHelperSingleton(){
}
public Animal[] buildAnimalList(){
final Animal[] animals = new Animal[10];
animals[0] = new SimpleAnimal(Animal.AnimalClass.MAMMAL,
"Dog", true, Color.GRAY);
animals[1] = new SimpleAnimal(Animal.AnimalClass.MAMMAL,
"Cat", true, Color.YELLOW);
animals[2] = new SimpleAnimal(Animal.AnimalClass.AMPHIBIAN,
"Frog", true, Color.GREEN);
animals[3] = new SimpleAnimal(Animal.AnimalClass.BIRD,
"Crow", true, Color.BLACK);
animals[4] = new SimpleAnimal(Animal.AnimalClass.BIRD,
"Cardinal", true, Color.RED);
animals[5] = new SimpleAnimal(Animal.AnimalClass.ARTHROPOD,
"Mantis", false, Color.GREEN);
animals[6] = new SimpleAnimal(Animal.AnimalClass.ARTHROPOD,
"Spider", false, Color.ORANGE);
animals[7] = new SimpleAnimal(Animal.AnimalClass.MAMMAL,
"Tiger", true, Color.ORANGE);
animals[8] = new SimpleAnimal(Animal.AnimalClass.MAMMAL,
"Bear", true, Color.BLACK);
animals[9] = new SimpleAnimal(Animal.AnimalClass.BIRD,
"Owl", true, Color.BLACK);
return animals;
}
}
慣用法2,Java中如何借助第三方類庫實現equals和hashCode
public class Bean{
private String name;
private int length;
private List<Bean> children;
}
Here's equals() and hashCode() implemented with Commons/Lang:
@Override
public int hashCode(){
return new HashCodeBuilder()
.append(name)
.append(length)
.append(children)
.toHashCode();
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return new EqualsBuilder()
.append(name, other.name)
.append(length, other.length)
.append(children, other.children)
.isEquals();
} else{
return false;
}
}
and here with Guava:
@Override
public int hashCode(){
return Objects.hashCode(name, length, children);
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Bean){
final Bean other = (Bean) obj;
return Objects.equal(name, other.name)
&& length == other.length // special handling for primitives
&& Objects.equal(children, other.children);
} else{
return false;
}
}
總結
本文通過簡單分析C++, Java兩種語言的區別,根據個人經驗給出了C++程序員如何轉Java的建議,並給出了Java中兩個常用的慣用法,希望對大家有所幫助。