面向Java开发人员的Groovy迁移

面向Java开发人员的Groovy迁移,java,groovy,Java,Groovy,我已经做了几年Java开发人员了。最近关于Groovy的讨论相当热烈。我查看了一下,它看起来很有趣,但我没有看到任何内在的“惊喜因素”;也就是说,我没有看到任何内在的价值开始在其中发展 现在,我可以肯定的是,我只是没有透过这里的树木看到森林。所以,我问了整个So社区:学习Groovy对任何Java开发人员都有什么好处?它比普通的ole Java有哪些特性/功能等(或做得更好) 软件世界中的事情不会无缘无故地像野火一样迅速发展。我确信Groovy有各种各样的小(和大)功能,这使它成为一个必须知道的

我已经做了几年Java开发人员了。最近关于Groovy的讨论相当热烈。我查看了一下,它看起来很有趣,但我没有看到任何内在的“惊喜因素”;也就是说,我没有看到任何内在的价值开始在其中发展

现在,我可以肯定的是,我只是没有透过这里的树木看到森林。所以,我问了整个So社区:学习Groovy对任何Java开发人员都有什么好处?它比普通的ole Java有哪些特性/功能等(或做得更好)


软件世界中的事情不会无缘无故地像野火一样迅速发展。我确信Groovy有各种各样的小(和大)功能,这使它成为一个必须知道的东西;我只是不明白。提前谢谢。

。。。因为到目前为止还没有人参与,所以我建议你看一下。关于Grails的类似问题也不时出现。这些都是伟大的群体,他们在某个时候或其他时候面临着相同类型的问题。

在我看来,Groovy对Java的一些最大优势是:

  • 由于重载运算符和简化的属性访问,代码更加简洁。而不是写作

    if (obj1.getBar().equals(obj2.getBaz())) { 
        obj3.setFoo("equal");
    }
    
    你可以写

    if (obj1.bar == obj2.baz) {
        obj3.foo = "equal"
    }
    
        def attributes = [color: "red", width: 1]
    
<>我认为更可读。< /P>
  • 地图和列表的内联符号。而不是

    Map attributes = new HashMap();
    attributes.put("color", "red");
    attributes.put("width", 1);
    
你可以写

if (obj1.bar == obj2.baz) {
    obj3.foo = "equal"
}
    def attributes = [color: "red", width: 1]
  • 对标准库的有用扩展。例如,您可以像这样读取文件和网页:

    def fileContents = new File('readme.txt').text
    def pageContents = new URL('readme.txt').text
    
  • 用于初始化属性的语法糖-例如

    MyClass myObject = new MyClass();
    myObject.setFoo("bar");
    myObject.setBaz(23);
    
可以用

    def myObject = new MyClass(foo: "bar", baz: 23)
  • “安全”取消引用-
    if(str!=null){return str.toUppercase();}否则{return null;}
    将变为
    return str?.toUppercase()

  • 正则表达式看起来更好

  • 闭包允许您以“函数式”风格编写代码,并使编写事件侦听器之类的东西变得更加容易

    • 你参加聚会有点晚了。Groovy在大约4年前迎来了曙光,当时人们厌倦了Java的荒谬冗长,准备为了代码缩减而放弃性能,Groovy正是以一种非常熟悉的语法为他们提供了这一点。但现在,它已经存在了一段时间,它像每种语言一样被它的过去所拖累,一些不是最好的设计决策将继续存在,正如我非常确定的是它的性能问题一样。这基本上就是Groovy++出现的原因,Groovy++的存在表明它的前身存在一些问题。事实上,Groovy++解决了它的前身的许多问题,但它也有自己的问题:主要的一个问题是,它基本上只由一个人——Alex Tkachman——的投入驱动,没有资金,所以你应该看到所有涉及的风险

      如今,越来越多的强大竞争对手出现了(科特林,锡兰),我很明显Groovy已经超过了它的巅峰——甚至它的核心团队也在颤抖(你应该看到他们关于暴躁模式的讨论)。这就是我开始逐渐放弃这项技术而选择Scala的原因,并期待即将到来的Kotlin,这两个项目都是伟大的项目,但需要一些努力才能让“Java思维”转向,但绝对值得

      由于超临界响应而更新

    • 设计错误:
      • 限制Java粘贴兼容性的语法,虽然实际上一个看似整洁的特性根本没有被使用,“因为出于同样的性能原因,将Java代码迁移到Groovy通常是一个坏主意。但这导致继承了一些Java的荒谬之处,比如无法定义外部上下文中使用的名称变量
      • 虽然保留了Java的一些坏习惯,但他们也去掉了它的一些好特性,比如代码块优先使用大括号而不是闭包。这个问题在斯卡拉解决得更为整洁
      • 之所以选择动态类型,主要是因为很难实现像样的类型推断——这基本上就是Groovy的创建者后来声明的原因
    • 在谷歌上搜索“groovy性能”会得到足够的结果。这里有一个:
    • 我从未说过Groovy++与核心Groovy是同一个项目
      我想让你们知道,我曾经是Groovy的超级粉丝,并且连续两年专门在Groovy上开发。学习一门新的语言对我来说是非常困难的一步。但是既然我知道Groovy的每一个角落,我知道它的核心团队及其趋势,你应该明白,当我建议不要把Groovy看作是java的替代品时,我知道我在做什么。

      < P>我会再加一个,因为我没有看到它被明确提及。 对我来说,虽然简洁本身很好,但它不是重点

      无论你写什么代码,Java都会看起来像Java,它的阅读方式永远不会像你正在解决的问题一样——它会像Java一样,解决你的问题

      我希望相反:我希望我的代码读起来像我正在解决的问题一样,是用[insert language here]编写的

      Groovy比Java更具表现力和可塑性。它可能看起来像我要做的。这方面的典型例子包括内部DSL。我经常使用的一个是,这只是Groovy代码,但听起来就像我大声朗读时正在做的事情。还有很多例子,但easyb很容易销售

      还没有提到AST转换,它允许很酷的编译时技巧。您可以在Java中使用AspectJ之类的东西玩类似的游戏,但它并不是“烘焙”的。像@Delegate、@Singleton等东西非常方便

      对我来说,语言需要具有可塑性、可变形性和灵活性:Java不是。Java有一个贫乏的抽象模型,这使得它的工作令人沮丧——在整个语言中,大量的额外工作,无论大小写,都是令人费解的