C# 和 Java 类属性有什么区别?

VSO*_*VSO 1 c# java

我只是想在 Java 类上定义一个属性 getter,并被告知 Java 不使用 getter 和 setter,而且实际上没有“属性”。(Java 中的虚拟(派生)属性是什么?

C# 和 Java“简单”/“值”/“属性”/“属性”类成员之间有什么区别,每种语言的选择有哪些优点/缺点?

以下面 C# 中的属性用法为例:

public class Dude{
    public string fName {get; set;} //this is what I mean by property
    public string lName {get; set;}
    public string fullName 
    {
        get {return this.fName + " " + this.lName;}
    }   
}
Run Code Online (Sandbox Code Playgroud)

eve*_*ton 5

在 Java 中,您没有像在 C# 中那样显式“声明属性”的语法方法。这并不意味着 Java语义上不存在属性。

来自官方文档

要在 bean 类中定义属性,请提供公共 getter 和 setter 方法

因此,以您的类为例,它在 Java 中看起来像这样:

public class Dude{
    public String fName;
    public String lName;

    public String getFName() {
        return fName;        
    }

    public void setFName(String fName) {
        this.fName = fName;
    }

    public String getLName() {
        return lName;
    }

    public void setLName(String lName) {
        this.lName = lName;
    }

    public String getFullName() {
        return this.fName + " " + this.lName;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用 Java 的反射 API 进行内省并操作PropertyDescriptors,您会注意到它们将读/写操作委托给 getter 和 setter:

BeanInfo info = Introspector.getBeanInfo(MyBean.class);
PropertyDescriptor[] pds = info.getPropertyDescriptors();

pds[0].getReadMethod().invoke(..);  // Call to getFName()
pds[0].getWriteMethod().invoke(..); // Call to setFName()
Run Code Online (Sandbox Code Playgroud)

除了从 C# 获得的语法糖之外,我认为 Java 上这种方法的最大问题是代码容易出错。复制/粘贴代码并忘记实际更改操纵变量是非常容易的。使用 C# 糖,您只需声明属性类型、名称和访问器,因此出现人为错误的空间就会减少。

  • 我一直在使用公司中现有的 java 应用程序,我必须说与 c# 的属性相比,这看起来很难看。 (2认同)