为什么我们使用set方法

时间:2010-11-12 01:01:06

标签: java android oop getter-setter

  

可能重复:
  What is the point of setters and getters in java?

我对set方法有疑问。如果可能,请提供一些细节。 我想知道为什么我们将set方法与类名一起使用。

public class Mymainclass {

Private class ClassC {

Private Mysecondclass sec = null;

public void setMymainclass(Mysecondclass second){

        Mymainclass.sec= second;
     }
   }
}

它只是设置sec变量值吗?如果是,为什么有类名称?

4 个答案:

答案 0 :(得分:1)

似乎你在一个类中使用“setter方法”混淆了“类构造函数”。

  • 构造函数的主要原因是初始化类变量
  • setter方法的主要原因是访问clas中的私有变量

因此,在您的情况下,方法的名称应为“setSec”而不是setMainClass。 也就是说,如果您想在初始化类之后修改私有变量“sec”,那么您可以选择使用setter方法。

另一方面,您也不能使用setter方法,只需在首次创建类时初始化sec变量。要做到这一点,你将不得不创建一个构造函数。 这个类的构造函数如下所示:

 Mymainclass(Mysecondclass sec){
     this.sec = sec;
 }

这样,只要创建Mymainclass的新实例,就可以传递Mysecondclass对象。

同时尝试确保在标记类时,使类名中的每个单词都具有其首字母大写:MySecondClass和MyMainClass !!

答案 1 :(得分:1)

首先,如果您遵循良好做法,您的方法应该被称为“setSeconds”。试想一下,如果你在课堂上添加会议成员,会有多么混乱。

编码设置器和getter有两个主要原因。

第一个是务实的。如果你想调用内省和java bean的魔力,那么你需要遵循这些约定。像FreeMarker这样的几个库/ API绝对依赖于在你的类中使用getter和setter方法。

第二个与好的设计有关。考虑一下你有一个叫做秒的公共成员。你的任何用户都可以通过编码来设置它。

instanceOfYourClass.seconds = 60;

这很好,除非您想对此值施加42秒的仲裁限制。要验证该值并将其设置为最多42秒,您现在需要一种方法来执行此操作。因此,您班级的每个用户现在必须将其代码更改为: -

instanceOfYourClass.setSeconds(60);

因此,从一开始就构建getter和setter,你可以灵活地构建类,以便在课堂上做更多异国情调的事情,同时为你的类用户提供一个稳定的界面,不会让他们改变他们的代码每次功能发生微小变化。

答案 2 :(得分:1)

我认为你混淆的部分原因是你提供的例子是错误的代码!您没有根据其参数的类命名一个setter,而是根据您正在设置的对象的属性对其进行命名。例如,您的示例的规范“正确”版本将是:

public class Mymainclass {

private Mysecondclass sec= null;

public void setSec(Mysecondclass second){

        this.sec= second;
   }
}

具有映射到属性名称的setter允许从UI到持久性的所有类型的不同框架以及它们之间以抽象方式操纵对象。例如,如果您告诉数据库层名为“sec”的属性映射到特定数据库列,它可以使用反射来查找名为“setSec”的方法并为您设置它!

当你有很多相同类型的属性,很多String s,很多BigDecimal s等等时,有很多方法命名为'set'的想法也会失效。如果有两个标准只能使用'set'并且必要时使用属性名称,那将是非常奇怪的。 (并且你会发现自己经常非常重构那些'套''方法。)

答案 3 :(得分:0)

在面向对象编程中,一个好的做法是公开getter和setter以允许其他类与类内容交互,而不是将成员变量公开。

即使大部分时间,至少在班级的第一个版本中,也没有比实际的赋值语句更多的东西,这将允许您稍后添加其他行为:

  • 添加日志记录跟踪以了解何时以及如何设置新值
  • 对真正分配之前传递的值进行一些控制/转换(如果另一个类提供了null,该怎么办?)
  • 触发一些新任务完成时可能需要的其他操作
  • ...