【问题标题】:I'd like to set and get instance properties with methods in a class我想使用类中的方法设置和获取实例属性
【发布时间】:2016-12-24 02:17:09
【问题描述】:

我是 Java 的初学者。我有一个问题。

Foo.java

public class Foo {
    private String name;
    private int num;

    Foo(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return this.name;
    }

    public int getNum() {
        return this.num;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setNum(int num) {
        this.num = num;
    }

}

Main.java

public class Main {
    public static void main(String[] args) {
        String name = "Tom";
        int num = 60;
        Foo bar = new Foo(name, num);
    }
}

我想使用getter()setter() 方法设置和获取实例属性,而不是Java 上的这种典型样式...

public void setter(String p) {
    this.p = p;
}

public String getter(String q) {
    return this.q
} 

我知道这些不起作用,但我想编写 Java 方法,例如在 Python 中遵循这些代码。

setattr(self, key, val)
getattr(self, key)

你能给我一些建议吗?

【问题讨论】:

  • 你想给setter方法输入任何值吗?
  • 您能否解释一下这背后的原因,或者您为什么不想使用 java 标准?
  • 您可以使用反射 API 来编写通用的 getter 和 setter 方法来按名称查找字段。但在你的情况下这是一个坏主意,你会遇到类型问题。因此,如果您想编写 java 代码,我建议坚持使用 java 代码标准。
  • @Kevin 感谢您的评论。我想在构造函数中使用setter,因为我不想编写每个属性,即使我创建了像Foo bar = new Foo(name, num);..haha 这样的实例,我可以在PythonPHPGo 中实现代码,所以我通常在构造函数中使用setter()
  • @ArcticLord 感谢您的评论。我检查了reflection。在某些网页中,他们不建议使用reflection。也许我必须遵循 Java 标准方式。

标签: java class


【解决方案1】:

您想要实现的目标可以使用 reflection 作为下一步:

// get the field "key" from the class "Foo"
Field field = Foo.class.getField("key");
// make it accessible as it is a private field
field.setAccessible(true);
// set the value of this field to val on the instance self
field.set(self, val);

更多关于反射的细节here

【讨论】:

  • 谢谢尼古拉斯。我不知道reflection。我检查并了解了这一点。谢谢。
【解决方案2】:

Java 不支持属性。

这样做的唯一方法是通过 accessormutator (get/set) 方法,就像您在顶部所做的那样。

见:does java have something similar to C# properties?

【讨论】:

  • 答案有点粗糙,需要去检查相关问题,同时它主要是正确的:java不提供通过静态方法访问实例变量。
  • 谢谢布兰登。这就是为什么我在搜索时找不到日语信息的原因。并感谢您的链接。
  • 感谢您的评论,Riduidel。我明白了。
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 2014-11-15
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多