C++程序员如何转Java

 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中两个常用的惯用法,希望对大家有所帮助。

时间: 2024-10-03 15:37:15

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

一位资深程序员大牛给予Java初学者的学习建议(转)

一位资深程序员大牛给予Java初学者的学习建议 这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议? 今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内容, 同样适用于一些希望转行到Java的同学. 在大家看之前,我要先声明两点. 1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线, 非Java Web和Java后

黑马程序员 &nbsp; 两道java面试题

1.List,Set,Map是否都继承了Collection接口?  List,Map比较常用:List是通过下标来访问元素,Map是通过键值进行访问元素.应该不会同时都实现了Collection接口.  Collection是一个什么概念?还有Set在java中是怎样定义的?他是通过下标来访问元素还是通过键值来访问元素?两者谁继承了Collection接口呢?或者有没有可能两者都继承了Collection接口?时间不多了,我是这样写的:  Set,Map实现了Collection接口.而Lis

黑马程序员 【】java学习之路——TCP(三)客户端上传文件到服务器

------- <a href="http://www.itheima.com" target="blank">android培训</a>.<a href="http://www.itheima.com" target="blank">java培训</a>.期待与您交流! ---------- import java.io.*; import java.net.*; class

80. 投奔怒海——一个Domino老程序员眼里的Java开发

这是一个以键盘鼠标为谋生工具已十多年的人初次进行专门的Java开发的体验和感受,对于Java程序员,这些也许早就习以为常,那就把这当成从一个来自不同世界的新人眼里看看他们自己的工作:对于我的Domino同行,这些体验或许将来有更多共鸣的可能. 在加入到这个Java产品开发团队之前,我的Java开发经验如下:十几年前跟着一本Java入门书做练习写的几个Applet,Domino项目开发中写的几个读写数据库和外部邮件的代理,XPages开发中的少量Java Beans和一个流程库.除此之外就只剩下对

黑马程序员_Java异常 Java常用库类

Java异常 1,异常的基本概念 异常是导致程序中断运行的一种指令流,它是在运行时期发生的不正常的情况,在Java中,一切的异常都秉着面向对象的设计思想,所有的异常都是以对象和类的形式存在的. 2,异常类的继承结构 在整个Java的异常结构中,实际上有两个最常用的类,Exception和Error,这两个类分别是Throwable的子类 Exception:一般表示的是程序中出现的问题,可以直接使用try....catch处理 Error:一般之的是JVM的错误,程序中无法处理. 3,Java的

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

一位资深程序员大牛给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内容,同样适用于一些希望转行到Java的同学. 在大家看之前,我要先声明两点.1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和J

好程序员告诉你Java架构师学习路线

好程序员告诉你Java架构师学习路线,从初级Java工程师成长为Java架构师,你需要走很长的路,很多有计划的人在学习之初就在做准备.你知道Java架构师学习路线该怎么走吗?成为一个优秀的Java架构师究竟需要学什么?接下来就跟小编一起揭晓答案. 架构师是一个充满挑战的职业,知识面的宽窄往往决定着一个架构师的架构能力.架构师在整个软件开发过程中都起着重要的作用,并随着开发进程的推进而其职责或关注点不断地变化. 想要成为Java架构师,你首先要是一个高级Java工程师,可以熟练使用各种框架,并知道

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

Java几乎是许多程序员们的入门语言,并且也是世界上非常流行的编程语言.国外程序员Andreas Kull在其Github上整理了非常优秀的Java开发资源,推荐给大家.译文由ImportNew- 唐尤华翻译完成. 以下为具体资源列表. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Grad

老菜鸟致青春,程序员应该选择java 还是 c#-

致青春 还记得自己那年考清华失败,被调剂到中科大软院,当初有几个方向可以选,软件设计.嵌入式.信息安全等等,毫不犹豫地选择了信息安全. 为什么选信息安全?这四个字听起来多牛多有感觉,我本科是学物理的,记得做一个光学实验的时候,一个老师看我做的结果,说,学物理不是什么人都可以的,这个是需要一点智商的. 好吧,当初其实并非对我一个人所说,但我确实感觉到受到了鄙视,同时,我没有任何在物理上的精湛技艺可以反击我的老师. 由于整个大学期间,我都在沉迷游戏和小说,以至于辅导员说,现在找你都得预约. 而我的同