C++程序员如何转Java

忙里偷闲,到了这个时间终于得空写一篇早想写的文章。其实本文的标题有些不太准确,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中两个常用的惯用法,希望对大家有所帮助。

C++程序员如何转Java的更多相关文章

  1. 一位资深程序员大牛给予Java初学者的学习路线建议

    java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...

  2. Spring MVC 程序首页的设置 - 一号门-程序员的工作,程序员的生活(java,python,delphi实战)

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  3. 转载:一位资深程序员大牛给予Java初学者的学习路线建议

    一位资深程序员大牛给予Java初学者的学习路线建议   java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打 ...

  4. 震惊!90%的程序员不知道的Java知识!

    震惊!90%的程序员不知道的Java知识! 初学Java的时候都会接触的代码 public static void main(String[] args){ ... } 当时就像背公式一样把这行代码给 ...

  5. 【转载】国外程序员整理的Java资源大全

    以下转载自: 推荐!国外程序员整理的Java资源大全中文版    https://github.com/akullpp/awesome-java英文版 Java 几乎是许多程序员们的入门语言,并且也是 ...

  6. 今天看到的一篇文章:一位资深程序员大牛给予Java初学者的学习路线建议

    一位资深程序员大牛给予Java初学者的学习路线建议 持续学习!

  7. 国外程序员整理的Java资源大全分享

    Java 几乎是许多程序员们的入门语言,并且也是世界上非常流行的编程语言.国外程序员 Andreas Kull 在其 Github 上整理了非常优秀的 Java 开发资源,推荐给大家. 译文由 Imp ...

  8. 【转】国外程序员整理的Java资源大全

    Java几乎是许多程序员们的入门语言,并且也是世界上非常流行的编程语言.国外程序员Andreas Kull在其Github上整理了非常优秀的Java开发资源,推荐给大家.译文由ImportNew- 唐 ...

  9. java初级开发程序员(初识java)

    据我们老师讲说:“学习java高级语言,每个程序员最初写的一个程序就是helloword,向世界打招呼! public class HelloWord{   //必须和文件名相同 public sta ...

随机推荐

  1. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  2. 运行执行sql文件脚本的例子

    sqlcmd -s -d db_test -r -i G:\test.sql 黑色字体为关键命令,其他颜色(从左至右):服务器名称,用户名,密码,数据库,文件路径 通过select @@servern ...

  3. requests的content与text导致lxml的解析问题

    title: requests的content与text导致lxml的解析问题 date: 2015-04-29 22:49:31 categories: 经验 tags: [Python,lxml, ...

  4. xpath提取多个标签下的text

    title: xpath提取多个标签下的text author: 青南 date: 2015-01-17 16:01:07 categories: [Python] tags: [xpath,Pyth ...

  5. 利用CSS中的:after、: before制作的边三角提示框

    小颖昨天分享了一篇参考bootstrap中的popover.js的css画消息弹框今天给大家再分享一篇使用:before和:after伪元素画消息弹框的CSS. 画出来是介个酱紫的: 有没有觉得画的萌 ...

  6. c#多线程

    一.使用线程的理由 1.可以使用线程将代码同其他代码隔离,提高应用程序的可靠性. 2.可以使用线程来简化编码. 3.可以使用线程来实现并发执行. 二.基本知识 1.进程与线程:进程作为操作系统执行程序 ...

  7. 使用蓝灯后,IE浏览器以及内置IE浏览器的程序不能使用的解决方案

    使用完蓝灯后,每次使用IE浏览器都不能正常使用,于是有了下面的这个方案 1.通过Win+R 打开注册表编辑器(regedit) 进入目录 HKEY_CURRENT_USER \ Software \ ...

  8. 浅谈java异常[Exception]

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...

  9. java中易错点(一)

    由于replaceAll方法的第一个参数是一个正则表达式,而"."在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成"/".如果想替换的只是&qu ...

  10. JAVA的内存模型(变量的同步)

    一个线程中变量的修改可能不会立即对其他线程可见,事实上也许永远不可见. 在代码一中,如果一个线程调用了MyClass.loop(),将来的某个时间点,另一个线程调用了MyClass.setValue( ...