[英]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中,通常的做法是将成员声明为private
或protected
并且只允许通过方法访问它们。 通常这会导致许多小的getFoo()
和setFoo(newFoo)
方法。 Python实际上没有private
和protected
,允许直接访问成员更常见。
正如其他人所指出的那样,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.