作者简介
作者:吴雪峰
简介:
ThoughtWorks 顾问,从事系统架构评估和设计、微服务架构培训和咨询、JVM 性能攻关和敏捷实践培训和精益组织建设。 从 2008 开始一直持续学习和使用 Scala,Play! 框架代码贡献者,2013 年开始做 Spark 和 AkkA 应用开发培训和咨询。
▼
如果你已经有多年 C 经验,要转 Java 做应用开发,恭喜你将进入既熟悉又陌生的新环境。
因为:
Java 大部分语法继承自 C,所以对 C 程序员来说很容易上手;
Java 是面向对象语言,对于 C 程序员来说会比较陌生;
除了这两项外,我看了一些 C 程序员写的 Java 代码后,觉得还有其他要注意或学习是事项。
入门
Java 入门推荐看《深入浅出 Java 》一书。
Java 目前主流的开发工具是 Eclipse 和 IntelliJ IDEA,我推荐使用 IntelliJ IDEA。
maven 是类似 CMake 又超越 CMake 的构建工具,maven 除了能编译、测试、打包外,还能自动管理类库依赖。
Java 设计之初,就带了一套代码规范,所以你一开始就要遵循 Java 的代码规范,否则 Java 程序员一眼就看出这不是 Java 代码了。 工具 java checkstyle 能在编译时就能检查出不遵循代码规范的问题。
Java 有专门的异常处理机制,而 C 没有。所以有些 C 程序员转到 Java 后,方法返回还是 int,把要返回的值放在参数里面,由方法内部进行修改。这种做法危害很大,把外部的对象传到方法内部进行修改会导致维护很难,也不利于并发执行。正确的姿势应该是,方法接受需要的参数,返回正常场景的值,异常情况抛出自定义异常。
我看到有些 C 程序员一上来就自己造轮子,虽然造轮子很有意思,但对于项目来说,往往事倍功半,是很低效的事情。
Java 之所以成为主流语言第一屹立不倒,并非语法多先进,而是有庞大的开源生态系统。作为合格的 Java 程序员对 Java SDK 熟悉是必须的,这里推荐《Core Java》上下卷,对 Java SDK 有全面的介绍。
除了 Java SDK,Java 生态系统里还有其他一些重要的类库,高级 Java 程序员都需要掌握。有些 C 转过来的架构师做 Java 系统设计,不做 Java 已有类库的技术调研就开始做设计,选用不恰当的 Java 类库做事情。这种态度对项目的损害非常大。
掌握前面 4 个后基本上就能做 Java 项目了,但如果不了解面向对象,出门不好意思说自己是 Java 程序员。推荐看《深入浅出面向对象分析与设计》。
面向对象最主要的目的是信息封装,手段是对象,把状态和行为封装在对象里面。
而 C 程序员很喜欢用 static,把对象当做有命名空间的全局状态而已,这是很不应该的。
应该说 Java 5 之后就很不推荐用 static 了, 因为 static 的初始化是在类装载过程中,出现问题比较难定位,最关键是 static 状态实际上就是全局变量,这是系统可维护性的大敌。 static 方法也使得类难以做单元测试。 所以 Java 5 以后,再加上 Spring 的流行,只有极少数 util 类用 static,其他类都应该不要用 static。
Java 有接口的概念,这和 C 的头文件声明类似,但可能有些 C 程序员没习惯用头文件,转到 Java 也不太用接口。在做 Java 模块设计时,应设计接口,然后基于接口编程。
另外面向对象有继承和多态,以前面向对象很强调这个,我个人认为应该慎用。继承的语义是 is a,当你用继承的时候,比如 A extends B,就要问问 A is a B 吗? 优先使用组合而不是继承。
进阶
如何写出无陷阱的 Java 虽然比 C 简单多了,但还是有很多需要注意的地方。
当 Java 入门后,第一本书应该是《Effective Java》,里面讲了很多 Java 深层次的陷阱和应当注意的问题。另外《clean code》我觉得无论是 C 程序员还是 java 程序员都是应该入门先读的,所以没在入门里列出来。
虽然 Java 面试的时候会被问到有哪些设计原则,其实你只要知道字面意思基本上也就差不多了,因为很多 Java 面试官可能也搞不清楚这些原则如何恰当使用和要义。但是作为软件系统设计,无论是 OO 还是过程或函数式编程,SOLID 原则都是适用的。所以作为高级 Java 软件工程师,理解和掌握这些设计原则是必须的。推荐《深入浅出面向对象分析与设计》作为入门,然后在日常的软件设计中时时琢磨。
所以设计模式也是 Java 面试的经典问题,我对于这个是持保留意见的。对于初学者来说,有些设计模式过于复杂;对于资深的人来说,基于业务场景恰到好处的设计才是最佳的。但设计模式又不可或缺,因为提供了一套很多人知道的设计术语,你可以很方便的跟人介绍你的设计,而已可以从设计模式里获取设计灵感。
虽然这篇是讲 C 转到 java,但现在已经是 Java 8 时代, 如果只讲面向对象,不好意思,过时了。
Java 8 正式引入 lambda 表达式,使得函数式编程在 Java 里面变成恨容易的事情,伴随着 lamdba,Java 的基础类库,尤其是集合类库做了大幅度的增强。lamdba 可以使代码更加简洁和健壮, 而函数式设计思想,可以使系统更健壮和并发友好。
博客地址:http://blog.yoqi.me/?p=915
这篇文章还没有评论