何时在java中使用get / set方法

时间:2010-11-11 16:43:09

标签: java getter-setter

我想知道何时在我的班级中使用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;
    }
}

由于

9 个答案:

答案 0 :(得分:37)

使用Getters / Setters与使用字段

根据经验:

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

答案 1 :(得分:23)

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

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

即使您不需要其中任何一项,也不会发生这种情况。如果你从现场访问开始,它将更难改变。

答案 2 :(得分:10)

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

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

我倾向于认为它会对简单对象造成一些混乱,但是如果你曾经不得不将公共属性重构为getter和setter以添加其他功能,那么你会发现它可能会很痛苦。

答案 3 :(得分: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;
}

答案 4 :(得分:3)

Getters和Setter允许您稍后更改实现(例如,执行更复杂的操作),允许您实现验证规则(例如setName如果名称不超过5个字符则抛出异常,无论如何。)

你也可以选择添加一个getter而不是setter,这样变量就像'只读'。

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

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

答案 5 :(得分:2)

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

如果您的意思是,请调用您自己的get和set方法,直接访问您班级中的vars,我仍然会说您自己的访问方法。这样,您作为get / set的一部分实现的任何转换,编辑或规则都会由您自己的内部调用以及外部调用者自动调用。

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

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

答案 6 :(得分:1)

这是一个品味问题,但一般来说,你总是应该对所有公共属性使用get / set方法。但对于像Value Objects(VO)这样的东西,你可能不会被打扰一段时间,你可以使用公共变量,而不会受到太多的批评。

答案 7 :(得分:1)

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

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


您还可以经常考虑在课堂上您可以直接访问您的内部(私人或受保护)成员,因为您应该知道自己在做什么,而且您不需要招致另一种方法调用的开销。

实际上,在一个班级工作的多个人可能不知道每个人在做什么,在大多数情况下,你的getter和setter中的那些完整性检查线可能是有用的,而微优化可能不是。


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

答案 8 :(得分:0)

封装类的私有字段,并按照您希望的方式使用getter / setter类公开它们。