什么是Python的属性()的Java等价物?

时间:2010-01-13 13:03:49

标签: java python properties

我是Java的新手,我想创建一些在访问时动态计算的类变量,就像使用property()方法在Python中一样。但是,我不确定如何描述这个,所以谷歌搜索向我展示了很多关于Java“Property”类的内容,但这看起来并不是一回事。什么是Python的属性()的Java等价物?

6 个答案:

答案 0 :(得分:7)

Java语言中没有这样的工具。你必须自己明确地编写所有的getter和setter。像Eclipse这样的IDE可以为你生成这个样板代码。

例如:

class Point{
  private int x, y;

  public Point(int x, int y){
    this.x = x;
    this.y = y;
  }

  public void setX(int x){
    this.x = x;
  }

  public int getX(){
    return x;
  }

  public void setY(int y){
    this.y = y;
  }

  public int getY(){
    return y;
  }
}

您可能需要查看Project Lombok,其中提供的注释@Getter@Setter与Python的property有些相似。

使用Lombok,上面的示例简化为:

class Point{
  @Getter @Setter private int x, y;

  public Point(int x, int y){
    this.x = x;
    this.y = y;
  }
}

答案 1 :(得分:3)

内置的property()函数与答案中描述的完全相反。它不是为成员变量生成getter和setter。它只允许您通过访问属性来调用方法(因此,尽管您只是访问Python类中的变量,但将调用一个函数)。 (this post ecplains如何以及为何使用它。)
这就是说,Java不提供这样的东西。更重要的是,在Java中不鼓励属性访问。我想你可以用Groovy脚本语言和元魔术来做到这一点。但我不知道如何做到这一点。

答案 2 :(得分:2)

他们并不存在。在Java中,通常的做法是将成员声明为privateprotected,并且只允许通过方法访问它们。通常这会导致许多小getFoo()setFoo(newFoo)方法。 Python实际上没有privateprotected,并且允许直接访问成员更常见。

答案 3 :(得分:1)

正如其他人所说,java有getter和setter,但没有严格的类比。有一个名为Project Lombok的第三方库使用注释在comile时生成.class文件中的getter和setter。这可以用来使事情变得不那么冗长。

答案 4 :(得分:0)

您想在课堂上创建新的字段/ getter / setter吗?如果要在运行时执行此操作,则必须使用字段和方法创建全新的类,并将其加载到JVM中。要创建新类,您可以使用ASM或CGLib之类的库,但如果您是Java新手,那么这不是您想要开始的。

答案 5 :(得分:-1)

实际上,您可以在Java中模拟此行为。

警告:丑陋的解决方案

您可以在实用程序类中编写方法,如下面的代码:

public Object getProperty(String property, Object obj) {
  if (obj != null && property != null) {
       Field field = obj.getClass().getDeclaredField(property);
       field.setAccessible(true);
       try {
          return field.get(obj);
       } catch (Exception ex) {
          return null;
       }
  }
  return null;
}

您实际上可以将其声明为静态方法,然后将此方法导入到需要此行为的类中。

顺便说一下,Groovy支持这个功能。