Java优缺点
学Java也有段时间了,从Python切换到Java还是有些不适应,会很自然的对两者进行对比。Java是静态语言,相比动态语言,它有利有弊。亲近了机器语言,远离了人类语言。
利:更适合机器的语言,因为编译成了字节码,所以运行速度比动态语言快
弊:对人类来说,可读性远不如动态语言。语法太多,复杂。相对Python,语法复杂度增加了不止一倍
从机器语言到人类语言,中间就是编程语言,一个编程语言越接近机器语言,在机器上的执行速度越快,但可读性越差;反之,越接近人类语言,在机器上的执行速度越慢,但可读性越好。
世界上没有完美的东西,Java也不例外,从开发出来到现在,Java一直在完善自己。但还是有一些地方不尽如人意。
我十分喜欢Apple的产品设计理念:精简。但Java的设计,跟精简还有相当的距离。跟Python相比,差距也很明显。当然,这跟Java是编译型语言以及直接从C++进化过来有关系。
1. 不支持override静态字段和静态方法
override静态字段,我感觉这个需求非常常见。在父类中定义static字段和static方法,子类调用父类的static方法,但我不想使用父类static字段的默认值,而是想在子类中重新赋值,同时,又不想影响父类的static字段。但Java就是不支持,这点太坑了。
后来,我在Quora(连这个网站也墙,垃圾)上找到了答案:Why can't static methods be overridden? ,里面提到,实例方法的查找是运行时确定的,而类方法和类变量的查找是编译时确定的,所以不能override。像Smalltalk和Objective-C的类方法的查找是运行时确定的,可以override
2. 接口
接口其实是抽象类的简化。Java设计者不想用C++的多继承,所以用的单继承,但同时增加了接口概念去实现与多继承相同的功能。不过Java8又往接口里加default方法,导致接口与抽象类之间只剩下一层内裤了:实例字段。那是不是就没必要定义接口这个概念呢?其实还是有意义的,它相当于Mixin类,相当于在语言层次,强制用户在多继承时,必须实现Mixin方式。
3. 没有函数概念
Java8增加lambda,开始支持匿名函数。但是仍然不支持非匿名函数。如果用户想定义一个函数,只能用lambda或者用接口实现,这类接口美其名曰:函数接口。这样设计不好,给函数套了个没用的套子。
4. 构造方法无法继承
由于构造方法与类名相同,导致子类无法天然继承父类的构造方法。定义子类时,必须再定义其构造方法,蛋疼。而Python中,构造方法名称是固定的`__init__`,子类天然就继承,非常方便
5. 定义了太多概念,很多没什么用
POJO,IoC,Model, Entity,DAO, Mapper 一堆概念,增加了开发者的学习成本,但有些没什么用。比中DAO,Mapper完全是一个东西,IoC其实就是DI
6. 编译语言的优点
跟脚本语言Python相比,Java的优势是执行速度快,因为很多都在编译时进行了优化,即用编译时间缩短了执行时间。另外,编译语言要显式定义类型,才能使用,这样的好处很多。其中一个是当函数的函数体很长时,你只看签名就知道这个方法的参数的类型和返回值的类型。类型就是结构,你一眼就知道它的输入参数的结构和输出参数的结构,可读性非常强。而Python这种脚本语言,你只能一行行阅读源码才能知道它的入参类型,出参类型。当然,也可以加注释说明,但可读性仍远不如编译型语言。
当然,这带来一定的复杂度,Python语言的学习成本比较低,而Java要高很多。相同的功能,Java的代码量比Python也多出不少。