0

可能重复:
java中的setter和getter有什么意义?

我有一个关于 set 方法的问题。如果可能,请提供一些细节。我想知道为什么我们使用带有类名的 set 方法。

public class Mymainclass {

Private class ClassC {

Private Mysecondclass sec = null;

public void setMymainclass(Mysecondclass second){

        Mymainclass.sec= second;
     }
   }
}

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

4

4 回答 4

1

首先,如果您遵循良好的做法,您的方法应该称为“setSeconds”。试想一下,如果您在班级中添加了分钟成员,那将是多么令人困惑。

编码 setter 和 getter 有两个主要原因。

第一个是纯粹的务实。如果您想调用自省和 java bean 的魔力,那么您需要遵循这些约定。有几个库/API,如 FreeMarker,它们完全依赖于你的类中的 getter 和 setter 方法。

第二个与良好的设计有关。假设您有一个名为 seconds 的公共成员。你班的任何用户都可以通过编码来设置它。

instanceOfYourClass.seconds = 60;

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

instanceOfYourClass.setSeconds(60);

因此,通过从一开始就构建 getter 和 setter,您可以灵活地在您的班级中做更多奇特的事情,同时为您的班级用户提供一个稳定的界面,这不会要求他们每次都更改他们的代码。是功能上的一个小改动。

于 2010-11-12T02:14:28.817 回答
1

我认为您感到困惑的部分原因是您给出的示例是错误的代码!您不会根据参数的类来命名设置器,而是根据您正在设置的对象的属性来命名它。例如,您的示例的规范“正确”版本将是:

public class Mymainclass {

private Mysecondclass sec= null;

public void setSec(Mysecondclass second){

        this.sec= second;
   }
}

拥有映射到属性名称的 setter 允许从 UI 到持久性以及介于两者之间的各种不同框架以抽象的方式操作您的对象。例如,如果您告诉数据库层名为“sec”的属性映射到特定的数据库列,它可以使用反射找到名为“ setSec”的方法并为您设置!

当你有很多相同类型的属性、很多Strings、很多BigDecimals 等等时,拥有很多只命名为 'set' 的方法的想法也会失效。如果有两个标准只在可能时使用“设置”并在必须时使用属性名称,那将是非常奇怪的。(而且你会发现自己非常频繁地重构掉那些仅“设置”的方法。)

于 2010-11-12T02:21:54.037 回答
1

似乎您将类中的“类构造函数”与“setter 方法”混淆了。

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

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

另一方面,您也不能使用 setter 方法,而只在第一次创建类时初始化 sec 变量。为此,您必须创建一个构造函数。此类的构造函数将如下所示:

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

这样,您可以在创建 Mymainclass 的新实例后立即传递一个 Mysecondclass 对象。

还要尝试确保在标记类时使类名中的每个单词的首字母大写如下:MySecondClass 和 MyMainClass!

于 2010-11-12T01:15:49.143 回答
0

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

即使大多数时候,至少在类的第一个版本中,不会有比实际赋值语句更多的内容,这将允许您稍后添加其他行为:

  • 添加日志记录以了解何时以及如何设置新值
  • 在真正分配之前对传递的值进行一些控制/转换(如果其他类提供 null 怎么办?)
  • 完成此新分配时触发一些其他可能需要的操作
  • ...
于 2010-11-12T01:10:02.497 回答