我有点困惑为什么语言有这些.我是一名Java程序员,在我职业生涯的开始阶段,所以Java是我写的唯一一种语言,因为我开始实际上,你知道,得到它.
所以在Java中我们当然没有属性,我们编写了getThis()和setThat(...)方法.
拥有房产我们会得到什么?
谢谢.
编辑:另一个问题:具有属性的语言中出现了哪些命名约定?
哪一个看起来更自然?
// A
person.setAge(25)
// B
person.age = 25;
// or
person.Age = 25; //depending on conventions, but that's beside the point
Run Code Online (Sandbox Code Playgroud)
大多数人会回答B.
这不仅是语法糖,它在做反射时也有帮助; 实际上,您可以在不依赖方法名称的情况下区分数据和操作.
以下是C#中不熟悉属性的示例:
class Person
{
public int Age
{
set
{
if(value<0)
throw new ArgumentOutOfRangeException();
OnChanged();
age = value;
}
get { return age; }
}
private int age;
protected virtual void OnChanged() { // ... }
}
Run Code Online (Sandbox Code Playgroud)
此外,大多数人总是使用属性而不是稍后推广公共成员,原因与我们总是使用get/set相同; 没有必要重写绑定到数据成员的旧客户端代码.
语法更好:
button.Location += delta;
Run Code Online (Sandbox Code Playgroud)
比:
button.setLocation(button.getLocation() + delta);
Run Code Online (Sandbox Code Playgroud)
编辑:
下面的代码假设您手动完成所有操作.在我的示例世界中,编译器将生成简单的get/set方法并将所有直接变量访问转换为这些方法.如果没有,那么客户端代码将不得不重新编译,这将失去很大一部分目的.
原版的:
属性的主要参数是,如果从变量转换为方法,则无需重新编译代码.
例如:
public class Foo
{
public int bar;
}
Run Code Online (Sandbox Code Playgroud)
如果我们后来决定验证"bar",我们需要这样做:
public class Foo
{
private int bar;
public void setBar(final int val)
{
if(val <= 0)
{
throw new IllegalArgumentException("val must be > 0, was: " + val);
}
bar = val;
}
public int getBar()
{
return (bar);
}
}
Run Code Online (Sandbox Code Playgroud)
但添加set/get方法会破坏所有代码.如果它是通过属性完成的,那么您可以在事后添加验证而不破坏客户端代码.
我个人不喜欢这个想法 - 我对使用注释的想法感到非常高兴,并且可以根据需要自动设置/获取简单的set/get geterated(但我不喜欢隐藏的方法)调用).