|
我之前一直在用C#, 最近刚刚开始用Java, 还是有很多不习惯,列出来跟大家一起讨论,有些不准确也请见谅。 需要说明的是,这里列出来我觉得Java不如C#的地方,我对Java并不熟悉,同样C#也有很多不足的地方。
整体而言,我觉得Java用起来不如C#方便,好用,但是确实Library/例子很多。C#最大的问题就是微软一家独大,而且没啥好的Open Source的资源,例子少,所以,虽然语言好用,但是开发效率可能并不高。一下是我遇到的一些用Java不爽的地方:
1) Property
C#中可以直接 public string Name { get; private set; }来定义一个property, 而Java还在用getName(), setName(), 同样功能代码要多不少,而且get/set也没有直接用property直观。
2) LINQ
LINQ虽然用的不好会有性能问题,但是在绝大多数情况,用起来能极大的缩短代码量,可读性也很好。Scala在Java之上增加了各种处理collection的API像fold, map, flatMap等等,不知道Java是不是有可能提供这些(或者已经提供了?)
3) File/Class name, Folder Structure
Java中class name必须跟file name对应起来,folder structure必须跟package的名字对应。虽然这使得代码结构更清晰,但是我觉得这个更适合于大工程,如果我只是个小程序,按照规则,我的package是com.companyname.project, 那我就得建3层目录,搞得太死板,用起来很不方便。相对而言,C#要灵活很多,你可以在一个文件里放多个class, 也可以让不同目录下的类属于同一个namespace。如果你真的想要这个功能,也可以通过Stylecop来实现。另外,可能有同学说这样比较容易找类,这个我同意,但是现代IDE已经把这个查找功能做的超级方便了,即使没有这个格式,也可以很容易找到。
4) Async/await
写过server端程序的人都知道,调试异步程序是非常非常痛苦的一件事,C#通过Async/await极大解决了这个痛苦,Java9希望能提供类似的功能。
5) Extension Method
C#可以给已有的类增加Extension Method, 它可以增加程序的可读性,让程序看起来更简洁,我个人觉得非常好用。
6) Method Parameter's default Value
Java不支持Method Parameters给default value, 推荐定义多个同名方法来实现这个功能。虽然效果一样,但是用Java要比C#多写好多行代码,感觉很不方便。
7) Tuple<T>
有时候写method返回值得时候,可能会希望返回2个值,而又不想再单独定义一个class的时候,Tuple就显得非常好用了。虽然自己可以很简单的实现Tuple, 但是Java如果像C#那样提供这个实现就更好了。
8) Nullable<T>
Scala用Option来提供了类似的概念,感觉Java也应该提供这样一个东西。
9) Checked/Unchecked Exception
Java把Exception分成Checked/Unchecked,感觉本身把这个问题复杂化了。按它的说法,可恢复的情况用checked exception,而不可恢复的情况用unchecked exception,但绝大多数情况,无论可不可恢复,你都需要gracefully shutdown或者恢复。别的语言很少有这样设计的,我个人觉得这个设计把简单的东西变麻烦了,结果大家以后可能就按最简单的Unchecked exception做了:-)
10) Class Initializer
在C#中,如果我要Initialize class中的properties的时候,我可以很容易用大括号来initialize, 但是Java中似乎没有这样的支持.
var c = new MyClass() {
Width = 10,
Height = 15
}; |
|