关于Java语言的吐槽。。

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.\n";
    // After the following return statement, any method that's awaiting  
    // ExampleMethodAsync (in this case, StartButton_Click) can get the   
    // integer result.  
    return exampleInt;
}

java中似乎缺少类似特性,至少没有如此易用的方式。

猜你喜欢

转载自www.cnblogs.com/mosakashaka/p/12609195.html