物业的动机是什么?

3 java oop properties java-7

我有点困惑为什么语言有这些.我是一名Java程序员,在我职业生涯的开始阶段,所以Java是我写的唯一一种语言,因为我开始实际上,你知道,得到它.

所以在Java中我们当然没有属性,我们编写了getThis()和setThat(...)方法.

拥有房产我们会得到什么?

谢谢.

编辑:另一个问题:具有属性的语言中出现了哪些命名约定?

Coi*_*oin 9

哪一个看起来更自然?

// 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相同; 没有必要重写绑定到数据成员的旧客户端代码.


Jor*_*ner 7

语法更好:

button.Location += delta;
Run Code Online (Sandbox Code Playgroud)

比:

button.setLocation(button.getLocation() + delta);
Run Code Online (Sandbox Code Playgroud)


Tof*_*eer 6

编辑:

下面的代码假设您手动完成所有操作.在我的示例世界中,编译器将生成简单的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(但我不喜欢隐藏的方法)调用).