4

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

有没有办法在 Java 中实现 Groovy 的简洁性,而无需使用 Groovy 或其他一些框架/附加组件?

我有一种感觉,当权者不会善待在我工作的地方引入这个外国框架。

因此,我正在寻找一种解决 Java 过于冗长的方法,而无需使用 Groovy 或类似的东西。

是否可以仅在 Java 中完成 - 例如通过简单地公开所有内容?

4

8 回答 8

8

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

一个很好的起点是开始使用它进行单元测试。本质上,当您在 groovy 中编写一个类时,它会编译为 Java 字节码。只要您的类路径中有 groovy jar,其他人甚至可能不知道它是 groovy 代码。通过使用它进行测试,您可以演示它如何简化您的代码并使事情变得更容易。你应该可以把它卖给管理层。

从那里开始,继续在其他新领域引入它,动态语言可以为您节省一些工作。Groovy 和 Java 很好地结合在一起,因为它们使用相同的核心库集。

于 2009-04-20T02:25:43.457 回答
6

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

我发现必须编写 getter 和 setter 是编写新类中最重复和最无趣的部分。使用像Eclipse这样的 IDE ,它可以自动为您生成 getter 和 setter,它可以减少编写冗余代码的痛苦。

当然,它不会减轻使用getXandsetX方法的需要,但至少它使类的实现更容易一些,负担更少。

于 2009-04-20T02:27:14.653 回答
3

使用不可变的数据结构。没有吸气剂,没有二传手,没有麻烦。

您可能想尝试一下函数式 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);
于 2009-04-20T02:39:26.807 回答
1

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

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

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

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

这将很容易编写,但是您必须获得 AOP 的支持,这可能具有挑战性。

但是,正如其他人提到的,Eclipse 和 Netbeans 将轻松创建 getter/setter,因此如果您不必对它们做任何特别的事情,那么它应该很容易。

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

于 2009-04-20T02:32:08.043 回答
0

除了针对特定任务(JPA、Swing 等)的更有效框架之外,我不知道有什么可以使您的源代码更小。

这种功能通常来自您的 IDE。

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

于 2009-04-20T02:26:40.113 回答
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 {
}
于 2009-04-20T14:36:52.043 回答
0

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

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

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

于 2009-04-26T23:09:28.550 回答
0

You can label any property or method with any of the standard access modifiers or type declarations in Groovy.

Remember, Groovy is a superset of Java.

于 2009-05-16T19:03:29.163 回答