2

I am new to Java...My question is

To do not access the data members outside of the class we use Access modifier, And why we are using setter methods to modify them outside of the class. Ex:-

public class Test
{

       private int a=10;
       private int b=20;
       public void sum(int x, int y)
       {
           System.out.println("Sum is:"+(x+y));
       }
       public void setA(int a)
       {
           this.a=a;
       }
       public void setB(int b)
       {
           this.b=b;
       } 
}

Like these type of cases why don't we use public members , instead of modifying them with the help of setter methods? And in which type situations we need to use setters...?

I'm unable to understand that..Somebody please help me

Thanks

4

6 回答 6

4

这叫做封装。Mutator 方法确保以预期和受控的方式修改字段。

于 2013-02-12T13:41:35.180 回答
3

因为您的要求可能会改变。

public void setA(int a)
{
    if (a >= 0) {
        this.a=a;
    }
}

如果您刚刚使用了公共成员,则必须在a设置了值的任何地方更改代码。如果您使用 setter 方法,您的代码只需在一个地方更改。

于 2013-02-12T13:42:27.087 回答
0

类的属性(在您的情况下为 a 和 b )描述了您的对象的状态。因此,在 OOP 中将状态设为私有并仅通过公共方法访问它们是一种很好的做法。

仅当有公共 setter/getter 时,您才能访问私有属性。因此,这为您提供了灵活性以及限制访问的选项(如果需要)。

于 2013-02-12T14:43:52.107 回答
0

封装的好处:

  1. 类的字段可以设置为只读或只写。
  2. 一个类可以完全控制其字段中存储的内容。
  3. 类的用户不知道该类如何存储其数据。一个类可以改变一个字段的数据类型,并且类的用户不需要改变他们的任何代码。

一个简单的用例:

您只想保持最低限度a

private int a;

public void setA(int a) {
    if(this.a > a)
         this.a = a;
}

然后你改变了主意,想保持最大a

public void setA(int a) {
    if(this.a < a)
         this.a = a;
}

如果您还没有使用setA()方法,那么您必须更新您尝试将新值设置为的每个位置a。但是如果你用过setA(),那么除了方法之外,你不需要接触任何其他地方setter

请看类似的问题:

Java中getter/setter的用途是什么?

于 2013-02-12T13:43:17.447 回答
0

根据 OOP,您应该始终使用私有属性来封装信息,并确保另一个程序员或对象会由于对变量的错误操作而影响任何方法功能,例如:

   private int a=10;
   private int b=20;
     public void div()
          {
                  System.out.println("Div is:"+(a/b));
           }
      public void setA(int a)
             {
                         this.a=a;
            }
     public void setB(int b)
           {
                  if(b!=0)
                    this.b=b;
           } 

例如,在这种情况下,setter 验证(我应该抛出错误或其他东西)不会将 0 保存为属性,因为如果发生这种情况,它将损坏div方法。

因此,基本上,当您需要保护属性上的数据或者您想确保保存在属性中的任何值都不会影响对象内部的功能/方法时,您可以使用 setter。

pd:对不起我的英语。

于 2013-02-12T13:44:46.980 回答
0

在一个经典的生物学实验中,一群猴子很想抓一根香蕉,结果给每个人洗了个冷水澡。他们很快就会停止尝试。渐渐地,猴子被新人取代,每个新手都学会了不碰香蕉的艰难方法:接受老手的一轮踢和咬。很快就没有原来的成员了;在场的任何人都没有亲眼目睹过冷水淋浴,事实上该机制早已被关闭。然而,新手仍然会因为试图吃香蕉而遭到殴打。

在我们的故事中,香蕉是公共领域,猴子就在你身边。不加批判地回避公共领域不是最佳做法。这是一种宗教习俗。有一系列标准的“论据”来支持它,但没有一个是普遍适用的。仅举几例:

  1. 需求可能会改变”——对纯数据对象的设置器的需求永远不会改变;它是最纯粹的稳定 API 示例之一。在业务逻辑设置中,域模型上的 getter/setter 绝不能只做纯粹的获取/设置,因为它们在许多不同的上下文中使用,包括测试,并且不能有任何意外。除了保留设置值之外的所有问题都在 getter/setter 代码之外处理;

  2. 内部表示可能会改变”——存储 an 的最佳方式int是在 an 中int,aString在 aString中,依此类推。永远不会出现这样的真实情况。

  3. 公共领域打破封装,OOP 的邮递”——公共 getter 和 setter 没有有效的封装,这是一种形式,没有实际效果;

  4. 公共字段防止通过框架代码进行检测/建议”——看看 Hibernate:它允许公共字段与 getter/setter 处于同等地位。这是现代 Java 中一个已解决的问题。

在所讨论的类仅在本地使用且不作为公共 API 公开的每种情况下,您都可以使用直接字段访问。此外,如果一个类表示纯数据,在许多情况下,即使在公共 API 中也可以使用公共字段。例如,参见GridBagConstraintsJava 标准库。

于 2013-02-12T14:17:38.030 回答