Java中等效于Python的property()是什么?

10 投票
6 回答
4448 浏览
提问于 2025-04-15 17:58

我刚开始学习Java,想创建一些类变量,这些变量在被访问时会动态计算,就像在Python中使用property()方法那样。不过,我不太确定该怎么描述这个,所以在网上搜索时看到很多关于Java“Property”类的内容,但这似乎不是同样的东西。那么,Java中有什么和Python的property()相似的东西呢?

6 个回答

2

其实它们并不存在。在Java中,通常会把类里的成员设置为private(私有)或protected(受保护),然后只能通过方法来访问这些成员。这种做法常常会导致很多小方法,比如getFoo()setFoo(newFoo)。而在Python中,实际上没有privateprotected这样的概念,通常会直接允许访问类里的成员。

4

内置的property()函数的作用和这里回答的内容正好相反。它并不是用来为成员变量生成获取器和设置器的。它的作用是让你通过访问一个属性来调用一个方法(所以,虽然你在Python类中只是访问一个变量,但实际上会调用一个函数)。这篇文章解释了如何以及为什么使用它。
说到这里,Java并没有类似的功能。更重要的是,在Java中不鼓励使用属性访问。不过,我想你可以在Groovy脚本语言中和一些元编程的技巧实现这个功能,但我不太记得具体怎么做了。

9

在Java语言中,没有自动生成获取器和设置器的功能。你需要自己手动写这些代码。不过,有些开发工具,比如Eclipse,可以帮你自动生成这些重复的代码。

举个例子:

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,它提供了类似于Python中property的注解@Getter@Setter

使用Lombok之后,上面的例子可以简化为:

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

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

撰写回答