繁体   English   中英

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

[英]What is the Java Equivalent of Python's property()?

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

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;
  }
}

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

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

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

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

实际上你可以在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支持此功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM