代码之家  ›  专栏  ›  技术社区  ›  Cerin

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

  •  9
  • Cerin  · 技术社区  · 15 年前

    我是Java新手,我想创建一些在访问时动态计算的类变量,就像Python中使用PrimyType()方法所做的那样。但是,我不太清楚如何描述这一点,所以Google向我展示了很多关于Java“属性”类的东西,但这似乎不是同一回事。Python的属性()的Java等价物是什么?

    6 回复  |  直到 15 年前
        1
  •  7
  •   missingfaktor Kevin Wright    15 年前

    在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;
      }
    }
    
        2
  •  3
  •   Stefan De Boey    15 年前

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

        3
  •  2
  •   Tom Dunham    15 年前

    它们并不真正存在。在Java中,通常将成员声明为 private protected 并且只允许通过方法访问它们。通常这会导致很多小的 getFoo() setFoo(newFoo) 方法。巨蟒真的没有 私有的 受保护的 更常见的是允许直接访问成员。

        4
  •  1
  •   mR_fr0g    15 年前

    正如其他人所指出的,Java有吸气剂和定位器,但没有严格的类比。有一个叫 Project Lombok THA使用注释在Comile时在.class文件中生成getter和setter。这可以用来使事情不那么冗长。

        5
  •  0
  •   Peter Å tibraný    15 年前

    是否要在类中创建新字段/getter/setter?如果您想在运行时这样做,就必须用字段和方法创建全新的类,并将其加载到JVM中。若要创建新类,可以使用类似ASM或CGLIB的库,但是如果您对Java是新的,则这不是您想开始的。

        6
  •  -1
  •   Kico Lobo    15 年前

    实际上,您可以在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支持这个特性。