我应该在Java类中始终使用getter/setter方法,还是有时可以使用公共属性?

我应该在Java类中始终使用getter/setter方法,还是有时可以使用公共属性?,java,android,class,methods,attributes,Java,Android,Class,Methods,Attributes,我已经编写Java大约4个月了。我刚开始用一本介绍书的指导编写android游戏。在本书中,它们没有封装类的任何属性 前 我总是被告知封装属性是一种很好的做法:只允许通过getter和setter方法访问私有属性 有没有比我更有经验的程序员能告诉我哪种方式是创建属性的“正确”编码方式?当然,为什么 接下来是一个问题:我应该总是封装类的私有属性并提供getter和setter方法,还是在某些情况下公共属性可以使用?封装是面向对象编程的核心概念之一。在我看来,使用getter和setter始终是一种

我已经编写Java大约4个月了。我刚开始用一本介绍书的指导编写android游戏。在本书中,它们没有封装类的任何属性

我总是被告知封装属性是一种很好的做法:只允许通过getter和setter方法访问私有属性

有没有比我更有经验的程序员能告诉我哪种方式是创建属性的“正确”编码方式?当然,为什么


接下来是一个问题:我应该总是封装类的私有属性并提供getter和setter方法,还是在某些情况下公共属性可以使用?

封装是面向对象编程的核心概念之一。在我看来,使用getter和setter始终是一种很好的做法。您应该避免的一件事是让外部实体随意搅乱类的内部结构

典型的例子,考虑有<代码> DeaFooe< /Cord>参数。使用

setter
getter
可以进行一个小的验证过程,确保用户不是将来出生的,或者是不可能老的。您还可以使用setter来更新一些其他字段,例如年龄


这种较小的验证还可以增强代码的可重用性,因为您不需要在调用这些getter和setter的任何其他类中进行这种检查。

封装提供了更大的灵活性。它提供了更多的控制,隐藏了实现细节。您可以在不提供set方法的情况下降低类的可变性。getter和setter可以有额外的逻辑。更改类实现更容易,而无需更改公共API(getter和setter是公共API的一部分)。

Accessors/getter-用于检查实例变量值的公共方法 对于能够使用类的客户机,ADT的实现者通常需要提供一个或多个公共函数,这些函数允许用户“查看”(检查)对象的私有实例变量的当前值。这些“只读”类型的方法称为访问器函数

例如:。, TwoDice类的两个适当的访问器函数是getDice1()和getDice2(),可用于查找其中一个骰子的当前值。getDice1()的定义是:

使用与getDice2()类似的定义。我们可以使用这些函数将第一个骰子的值存储在整数变量valueOfDie1中,如下所示:

   TwoDice roll = new TwoDice() ;
   int valueOfDie1 = roll.getDice1() ;
在方法调用roll.getDice1()中,对象roll是当前对象(为其调用方法的对象),因此将getDice1()应用于此对象将返回值roll.dice1

Mutators/Setters—用于更改实例变量值的公共方法。 变数应该包括数据验证,以确保实例变量的值不超过其允许的范围。 例如, TwoDice类有一个有趣的属性,即一旦创建了TwoDice对象,它的值就不能更改——没有提供公共方法来允许客户端代码这样做。这些对象被称为不可变的,这意味着它们一旦被创建就不能被修改。许多Java自己的类都具有只提供不可变对象的特性,例如String和Color类

类设计器通常提供所谓的mutator或setter方法,以使客户机代码能够修改对象的值。这是潜在的危险,因为它可能会损害私有数据的安全性。因此,ADT的实现者必须提供适当的数据验证,以确保属性(实例变量)的值在其允许值的范围内正确设置。我们TwoDice类的合适的mutator方法是setDice1(int n)和setDice2(int n),下面给出了其中第一个的定义:

 public void setDice1( int n )
   {
      assert (n >= 1) && (n <= 6) : "value of dice1 out of range: " + n ;
      dice1 = n ;
   } 
public void setDice1(int n)
{

assert(n>=1)&(n如果我们把纯粹主义的观点放在一边,那么我们就有两个很好的理由使用getter和setter-

<> LI>

如果你想修改你的行为,它将减少将来你必须做的代码更改量。考虑你突然需要做的下列情况-验证一些输入,使某些字段被计算或在改变时影响其他字段,限制GET或SET操作的范围或使它们不均匀,修改字段在某个继承类中的行为,或者以某种奇怪的方式存储字段。如果您已经有了getter和setter,那么这些更改除了更改本身之外不会花费任何成本。如果没有,您将不得不修改项目中字段的每个用法

  • 它允许您实现需要getter或setter的接口


  • 在大多数情况下,您不应将类视为外部操作的一组属性,而应将其视为向应用程序提供特定服务的实体。该类的大多数属性最终都是私有的,并且没有get或set方法

    但也有例外:例如,在某些设置中,您会发现只包含值的类,它们本身很少或根本没有逻辑。这类类类的通常规则是将字段设置为私有,并提供get和set方法,因为一旦您将某个对象设置为公共对象,并且某个其他类依赖于它,则无法对其进行更改。例如le您可能希望确保特定字段的值从不为null或进行其他验证;如果使用set方法,则可以在此处添加检查,但如果该字段为公共字段,则无法执行任何操作。另一个示例:您可能希望更改字段类型以进行某些优化,但如果该字段为公共字段,则无法执行任何操作不要

    所有规则都是为了
       TwoDice roll = new TwoDice() ;
       int valueOfDie1 = roll.getDice1() ;
    
     public void setDice1( int n )
       {
          assert (n >= 1) && (n <= 6) : "value of dice1 out of range: " + n ;
          dice1 = n ;
       }