php是不是最好的语言不知道,但是java可能是我用过的最难用的语言,尤其是在用过c#以后,可能说的不对,希望有人能改正。
类属性
c#的属性比getter/setter方便的多。
c#
class Sample {
public String prop {get;set;}
}
java
class Sample {
public String prop;
//getter....
//setter...
}
类创建的属性设置
c#可以构造的时候设置属性,而java只能先new,然后通过setter来设置。
c#
var a = new Sample() {
prop = "123"
};
java
Sample a = new Sample();
a.setProp("123");
匿名类
c#支持直接定义一个匿名类的实现。
var c = new {
name = "hello",
id = 123
};
而java实例化一个匿名类,需要预先定义一个接口,这或许不是所需要的效果。。。
new Thread(new Runnable() {// 实现runnable接口
public void run() {
System.out.println("Runnable running..");
}
}).start();
定义变量时识别变量类型-var
c#可以隐式声明类型,编译器能自动识别。java不行。
这点当类型越长时,体验越差。
c#
var a = new ArrayList<Sample>();
java
List<Sample> a = new ArrayList<Sample>();
类型擦除
由于编译时的类型擦除,java的模板比c#难用很多。这篇文章讲的很详细了
java中,以下泛型无法工作:
static <T> void genericMethod (T t) {
T newInstance = new T (); // error: type creation
T[] array = new T [0]; // error: array creation
Class c = T.class; // error: Class querying
List<T> list = new ArrayList<T> ();
if (list instanceof List<String>) {}
// error: illegal generic type for instanceof
}
而c#中则是可以的:
static void GenericMethod<T> (T t)
where T : new()
{
T newInstance = new T (); // OK - new() constraint.
T[] array = new T [0]; // OK
Type type = typeof(T); // OK
List<T> list = new List<T> ();
if (list is List<String>) {} // OK
}
一个常见的被这个特性影响的地方就是java的反序列化,如果需要反序列化泛型,可以看到很多工具会提供TypeReference
的类来辅助反序列化,而不能仅仅通过泛型做到识别正确的类型。
日期时间
java8虽然提供了time类型,但是代码中很难避免(也很难让所有人都避免)适用Date类,甚至是Calendar。
很难想象java.util.Date
这种非常合适的类名下,无法做到很多常用的日期操作。
仅仅要计算两个Date
相差的天数,就需要以下这种看起来像是hack一样的方式。
long betweenDays = (date2.getTime() - date1.getTime()) / (1000L * 3600L * 24L);
对于c#则相当简单(内部自动会用TimeSpan
类计算)
(date2 - date1).TotalDays
linq/stream
c#的linq个人认为可以相当简洁,直接基于Collection
进行操作。
java现在也支持这种操作,利用的是stream
方式,结合collector
等辅助。但是整个语法看起来像是插件,有很强的割裂感。
//c#
testList.Where(p => p.key = "targetKey").FirstOrDefault();
//java
Optional<Sample> sampleOptional = testList.stream().filter(p -> p.key.equals("targetKey")).findFirst();
Sample sample = (sampleOptional.isPresent()) ? sampleOptional.get() : null;
关于异步
而c#语言中的async/await
关键字不可谓不强大:
public async Task<int> ExampleMethodAsync()
{
var httpClient = new HttpClient();
int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.
";
// After the following return statement, any method that's awaiting
// ExampleMethodAsync (in this case, StartButton_Click) can get the
// integer result.
return exampleInt;
}
java中似乎缺少类似特性,至少没有如此易用的方式。