我正在寻找一种解决Java过度冗长而不使用Groovy的方法

时间:2009-04-20 02:17:02

标签: java groovy verbosity

我喜欢Groovy如何将所有实例变量和类变量公开,并代表您编写getter和setter。这节省了大量不必要的编码。另一方面,我的老板讨厌它,让我很伤心:(

有没有办法在不使用Groovy或其他框架/附加组件的情况下在Java中实现Groovy的简洁性?

我有一种感觉,在我工作的地方引入这个外国框架的能力是不会的。

所以我正在寻找的是解决Java的过度冗长而不使用Groovy或类似的东西。

可以单独用Java完成 - 例如简单地将所有内容公开吗?

8 个答案:

答案 0 :(得分:8)

Java语言就是这样。如果不转换到新语言(如groovy),您将找不到更改核心语言的内容。从管理层获得支持可能并不像你想象的那样难以实现。几年前我和你一样处于类似的位置。您可以开始将groovy引入软件的一些有意义的区域。

一个好的起点是开始使用它进行单元测试。基本上,当你在groovy中编写一个类时,它会编译为Java字节码。只要你的类路径上有groovy jar,其他人甚至可能都不知道它是groovy代码。通过将其用于测试,您可以演示如何简化代码并简化操作。您应该能够将其出售给管理层。

从那里开始,不断将它介绍到动态语言可以为您节省一些工作的其他新领域。 Groovy和Java很好地融合在一起,因为它们使用相同的核心库集。

答案 1 :(得分:6)

在这种情况下,可以为你编写getter和setter的IDE可以成为你的朋友。

我发现必须编写getter和setter是编写新类时最重复且最无趣的部分。使用像Eclipse这样的IDE,它可以automatically generate the getters and setters,它可以减少编写冗余代码的痛苦。

当然,它不会减少使用getXsetX方法的需要,但至少它使类的实现更容易一些,而且负担更轻。< / p>

答案 2 :(得分:3)

使用不可变数据结构。没有吸气剂,没有安装者,没有麻烦。

您可能想尝试Functional Java。它只是一个常规的Java库,但它带有强大的抽象和有用(不可变)的数据结构,可以让你用更少的代码说出更多。例如,翻译一下:

List<String> s = new ArrayList<String>();
  for (String x : xs) {
    for (String y : ys) {
      for (String z : zs) {
        s.add(doSomething(x, y, z));
      }
    }
  }

......对此:

List<String> s = xs.bind(ys, zs, doSomething);

答案 3 :(得分:1)

您可以使用AOP来帮助消除一些冗长的内容。

例如,如果您有一个属性: 字符串名称;

然后你可以定义: @GetterSetter public String Name(String name){};

然后有一个方面寻找注释,并在其上放置,以便任何读取,即参数为null,或写入(参数不为空),然后它将采取适当的动作。

这很容易写,但是你必须得到AOP的支持,这可能很有挑战性。

但是,正如其他人所提到的,Eclipse和Netbeans会很容易地创建getter / setter,所以如果你不需要对它们做任何特殊的事情那么它应该很容易。

我倾向于将我的属性放在他们自己的类中,这只是getter / setter,然后我不必查看详细信息,以及equals和hash方法(如果需要),然后在我的其他类中我只是使用它,并隐藏无聊的额外编码。

答案 4 :(得分:0)

除了针对特定任务的更有效的框架(JPA,Swing等)之外,我不知道有什么东西能让你的源代码更小。

如果功能通常来自您的IDE,那就是那种。

我使用Netbeans,它具有编写getter / setter的工具,自动实现抽象方法和各种其他快捷方式。当然源代码仍然很冗长。

答案 5 :(得分:0)

尝试我的bean注释:http://code.google.com/p/javadude/wiki/Annotations

注释处理器为您生成一个超类,其中包含许多您通常必须编写的典型样板:

@Bean(
    properties={
        @Property(name="name", bound=true),
        @Property(name="age", type=int.class, bound=true)
    }
)
public class Person extends PersonGen {
}

答案 6 :(得分:0)

通过使用特定于域的框架,您可以极大地提高Java的有效抽象级别。例如,当您编写RESTful Web服务时,Restlet会处理大部分无聊的细节。或者,如果需要将POJO映射到XML或JSON,则XStream或JAXB等软件包会自动生成映射逻辑。为了避免繁琐的JDBC编程,请尝试像iBatis或Hibernate这样的持久性管理器。像Freemarker和Velocity这样的模板化系统可以更容易地生成标记。

即使没有工具支持,您也可以找到将低级细节分解为常用方法和类的方法,以便您的顶级代码感觉更抽象。

(您可以考虑询问您的老板是否可以在项目中评估Groovy的支持角色,例如编写一些单元测试。)

答案 7 :(得分:0)

您可以使用Groovy中的任何标准访问修饰符或类型声明来标记任何属性或方法。

请记住,Groovy是Java的超集。