24

我想知道什么时候在我的类中使用 get 和 set 方法(getName,setName),什么时候使用classVariable.name = ""简单а = classVariable.getName()

这是使用 set 和 get 方法的类示例

public class ClassExampe {

    String name;
    String course;

    public String getName ( )
    {
        return name;
    }

    public void setName (String studentName)
    {
        name = studentName;           
    }

    public String getCourse ( )
    {
        return course;
    }

    public void setCourse (String studentCourse)
    {
        course = studentCourse;
    }
}

谢谢

4

9 回答 9

37

使用 Getter / Setter 与使用字段

根据经验:

直接使用来自同一个类的变量(实际上来自同一个 .java 文件,所以内部类也可以),使用其他类的 Getters / Setters。

于 2010-11-11T16:46:32.133 回答
22

简单的规则是:永远不要使用直接访问(当然,从类内部引用它们时除外)。

  • 无法代理字段访问
  • 你可能想要一些事件通知
  • 您可能需要防范竞争条件
  • 表达式语言支持 setter 和 getter
  • 从理论上讲,这会破坏封装。(如果我们是迂腐的,所有字段的 setter 和 getter 也会破坏封装)
  • 可能希望在 setter 或 getter 中执行一些额外的逻辑,但这很少是可取的,因为消费者希望这遵循约定 - 即成为一个简单的 getter/setter。
  • 您可以只指定一个 setter 或只指定一个 getter,从而实现只读或只写访问。

即使这没有发生您需要任何这些,也不是不可能的。而且,如果您从字段访问开始,将更难更改。

于 2010-11-11T16:46:11.783 回答
10

在 Java 中,使用 getter 和 setter 通常被认为是最佳实践。

这是因为如果您在访问或修改属性时需要更改代码以执行其他操作,您只需在现有的 getter 或 setter 中更改它即可。

我倾向于认为它会给简单的对象带来一些混乱,但是如果您曾经不得不将公共属性重构为 getter 和 setter 以添加额外的功能,您会发现这可能会很痛苦。

于 2010-11-11T16:46:08.367 回答
6

我怀疑大多数人会说总是使用 getter/setter 来访问私有成员。这不是必需的,但被认为是“最佳实践”。

一个优点是您可以拥有的不仅仅是简单的分配和返回。例子:

public void setLevel(int lvl)
{
    if (lvl<0)
    {
        this.level=1;
    }
    else
        this.level = lvl;
}

public int getLevel()
{
    if (this.someIndicator==4)
        return this.level*7.1;
    else
        return level;
}
于 2010-11-11T16:46:26.597 回答
3

Getter 和 Setter 允许您稍后更改实现(例如,做一些更复杂的事情),允许您实现验证规则(例如setName,如果名称不超过 5 个字符,则抛出异常,无论如何。)

您还可以选择添加 getter 但不添加 setter,以便变量类似于“只读”。

这就是理论,但是在许多情况下(例如,使用 setter 的 Hibernate)您不能在 setter 中抛出异常,因此您无法进行任何验证。通常,该值将被分配/返回。在我工作过的一些公司中,必须为所有属性编写 getter 和 setter。

在这种情况下,如果你想从对象外部访问一个属性,并且你希望它是可读/可写的,我只使用一个公共属性。它的代码更少,这意味着您可以编写obj.var += 5obj.setVar(obj.getVar() + 5).

于 2010-11-11T16:48:40.153 回答
2

如果您的意思是:何时使用公共访问器方法而不是公开内部私有变量,我的答案是“总是”,除非有严重的性能原因。

如果你的意思是,调用你自己的 get 和 set 方法,而不是直接访问你的类中的变量,我仍然说调用你自己的访问方法。这样,您在 get/set 中实施的任何转换、编辑或规则都会被您自己的内部调用以及外部调用者自动调用。

在纯 OO 语言(例如 Smalltalk)中,没有公共的概念——所有内部变量都是私有的,因此您必须使用访问器。在不太纯的 OO 语言中,您可以将事情公开 - 但是从长远来看,公开数据结构和实现的内部结构对于稳定性和维护来说是一个非常糟糕的主意。查找“紧耦合”以了解更多信息。

简而言之,如果您公开公开内部变量,人们可以直接访问它们,并且如果您更改名称或在换行符处键入所有内容。这称为副作用。

于 2010-11-11T16:49:21.750 回答
1

这是一个口味问题,但一般来说,您始终应该对所有公共属性使用 get/set 方法。但是对于像值对象(VOs)这样的东西,你可能会在一段时间内不会被打扰,我认为你可以使用公共变量而不会受到太多批评。

于 2010-11-11T16:45:55.850 回答
1

通常,您希望使用 setter 和 getter 让开发人员有机会通过修改或扩展代码来重用您的代码,以便在访问和修改内部数据时添加处理和控制层。当使用直接访问时,这在 Java 中是不可能的。

括号:但是,在其他语言中是完全有可能的,例如在 Scala 中,当属性和方法之间的界限变得非常精细时。这很棒,因为这样它就不会成为阻碍的编码问题,并且它使使用更加透明。


您还可以经常考虑,在您的课堂上,您可以随意直接访问您的内部(私有或受保护)成员,因为您应该知道自己在做什么,并且您不需要承担额外的开销另一个方法调用。

实际上,在一个类中工作的多个人可能不知道每个人在做什么,并且在大多数情况下,在 getter 和 setter 中进行完整性检查可能很有用,而微优化可能没有用。


此外,您只有一种方法可以直接访问变量,而您可以定义任意数量的访问器。

于 2010-11-11T16:54:34.977 回答
0

封装类的私有字段,并以您想要的方式使用 getter/setter 类公开它们。

于 2010-11-11T17:50:20.087 回答