zoukankan      html  css  js  c++  java
  • 关于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.
    ";
        // After the following return statement, any method that's awaiting  
        // ExampleMethodAsync (in this case, StartButton_Click) can get the   
        // integer result.  
        return exampleInt;
    }
    

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

  • 相关阅读:
    软件项目技术点(12)——绘制生成的图表到canvas
    软件项目技术点(11)——大图变小图提高绘图性能
    软件项目技术点(10)——将视频video绘制到canvas
    Git代码版本控制流程
    TypeScript名词解释系列:tsconfg中的target,module和moduleResolution
    正则表达式基础知识
    node-npm发布包-package.json中bin的用法
    npm link的作用——避免频繁发布更新
    AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…
    2020高德技术年刊:18万字、750页+,智慧出行最佳技术实践都在这了
  • 原文地址:https://www.cnblogs.com/mosakashaka/p/12609195.html
Copyright © 2011-2022 走看看