# 属性

> 原文： [https://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html](https://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html)

要在 bean 类中定义属性，请提供 public getter 和 setter 方法。例如，以下方法定义名为`mouthWidth`的`int`属性：

```
public class FaceBean {
    private int mMouthWidth = 90;

    public int getMouthWidth() {
        return mMouthWidth;
    }

    public void setMouthWidth(int mw) {
        mMouthWidth = mw;
    }
}

```

像 NetBeans 这样的构建器工具可识别方法名称，并在其属性列表中显示`mouthWidth`属性。它还识别类型`int`，并提供适当的编辑器，以便在设计时操作属性。

此示例显示了可以读取和写入的属性。其他组合也是可能的。例如，只读属性具有 getter 方法但没有 setter。只写属性仅具有 setter 方法。

`boolean`属性的特殊情况允许使用`is`而不是`get`定义访问器方法。例如，`boolean`属性`running`的访问者可以如下：

```
public boolean isRunning() {
    // ...
}

```

可以使用各种基本属性的特殊化，并在以下各节中进行介绍。

## 索引属性

_ 索引 _ 属性是一个数组而不是单个值。在这种情况下，bean 类提供了获取和设置整个数组的方法。以下是名为`testGrades`的`int[]`属性的示例：

```
public int[] getTestGrades() {
    return mTestGrades;
}

public void setTestGrades(int[] tg) {
    mTestGrades = tg;
}

```

对于索引属性，bean 类还提供了获取和设置数组的特定元素的方法。

```
public int getTestGrades(int index) {
    return mTestGrades[index];
}

public void setTestGrades(int index, int grade) {
    mTestGrades[index] = grade;
}

```

_ 绑定 _ 属性会在侦听器的值发生变化时通知它。这有两个含义：

1.  bean 类包括用于管理 bean 的侦听器的`addPropertyChangeListener()`和`removePropertyChangeListener()`方法。
2.  当绑定属性发生更改时，bean 会向其注册的侦听器发送`PropertyChangeEvent`。

`PropertyChangeEvent`和`PropertyChangeListener`存在于`java.beans`包中。

`java.beans`包还包含一个类`PropertyChangeSupport`，它负责绑定属性的大部分工作。这个方便的类跟踪属性侦听器，并包含一个方便的方法，可以向所有已注册的侦听器触发属性更改事件。

以下示例显示如何使用`PropertyChangeSupport`使`mouthWidth`属性成为绑定属性。绑定属性的必要添加内容以粗体显示。

```
import java.beans.*;

public class FaceBean {
    private int mMouthWidth = 90;
    private PropertyChangeSupport mPcs =
        new PropertyChangeSupport(this);

    public int getMouthWidth() {
        return mMouthWidth;
    }

    public void setMouthWidth(int mw) {
        int oldMouthWidth = mMouthWidth;
        mMouthWidth = mw;
        mPcs.firePropertyChange("mouthWidth",
                                   oldMouthWidth, mw);
    }

    public void
    addPropertyChangeListener(PropertyChangeListener listener) {
        mPcs.addPropertyChangeListener(listener);
    }

    public void
    removePropertyChangeListener(PropertyChangeListener listener) {
        mPcs.removePropertyChangeListener(listener);
    }
}

```

绑定属性可以使用 NetBeans 等构建器工具直接绑定到其他 bean 属性。例如，您可以获取滑块组件的`value`属性并将其绑定到示例中显示的`mouthWidth`属性。 NetBeans 允许您在不编写任何代码的情况下执行此操作。

## 约束属性

_ 约束 _ 属性是一种特殊的绑定属性。对于约束属性，bean 会跟踪一组 _ 否决 _ 侦听器。当约束属性即将更改时，将向侦听器咨询有关更改的信息。任何一个听众都有机会否决这一变化，在这种情况下，该财产保持不变。

否决听众与财产变更听众分开。幸运的是，`java.beans`包中包含一个`VetoableChangeSupport`类，可以大大简化约束属性。

对`mouthWidth`示例的更改以粗体显示：

```
import java.beans.*;

public class FaceBean {
    private int mMouthWidth = 90;
    private PropertyChangeSupport mPcs =
        new PropertyChangeSupport(this);
    private VetoableChangeSupport mVcs =
        new VetoableChangeSupport(this);

    public int getMouthWidth() {
        return mMouthWidth;
    }

    public void
    setMouthWidth(int mw) throws PropertyVetoException {
        int oldMouthWidth = mMouthWidth;
        mVcs.fireVetoableChange("mouthWidth",
                                    oldMouthWidth, mw);
        mMouthWidth = mw;
        mPcs.firePropertyChange("mouthWidth",
                                 oldMouthWidth, mw);
    }

    public void
    addPropertyChangeListener(PropertyChangeListener listener) {
        mPcs.addPropertyChangeListener(listener);
    }

    public void
    removePropertyChangeListener(PropertyChangeListener listener) {
        mPcs.removePropertyChangeListener(listener);
    }

    public void
    addVetoableChangeListener(VetoableChangeListener listener) {
        mVcs.addVetoableChangeListener(listener);
    }

    public void
    removeVetoableChangeListener(VetoableChangeListener listener) {
        mVcs.removeVetoableChangeListener(listener);
    }
}

```

## NetBeans 中的开发支持

用于创建 bean 属性的编码模式很简单，但有时很难判断您是否正确地使用了所有内容。 NetBeans 支持属性模式，因此您可以在编写代码时立即看到结果。

要利用此功能，请查看 **Navigator** 窗格，该窗格通常位于 NetBeans 窗口的左下角。通常，此窗格处于**成员视图**模式，该模式显示当前类中定义的所有方法和字段。

单击组合框切换到 **Bean Patterns** 视图。您将看到 NetBeans 可以从方法定义推断出的属性列表。 NetBeans 在您键入时更新此列表，使其成为检查您的工作的便捷方式。

在以下示例中，NetBeans 已找到读写`mouthWidth`属性和读写索引`testGrades`属性。此外，NetBeans 已经认识到`FaceBean`允许注册`PropertyChangeListener`和`VetoableChangeListener`。

<center>![NetBeans bean patterns Navigator](img/e87292778b9ae0ce172d1ff96489d9c4.jpg)</center>