【问题标题】:why we use set method [duplicate]为什么我们使用set方法[重复]
【发布时间】:2011-05-08 19:50:23
【问题描述】:

可能重复:
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 变量值吗?如果是,为什么有设置的类名?

【问题讨论】:

  • 重复:stackoverflow.com/questions/1461598/… java中的setter和getter有什么意义?
  • 我认为这不是重复。这不仅是 setter 和 getter 问题,而且是 set 方法后跟 classname,这让我感到困惑。

标签: java android oop getter-setter


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 Kevin 的回复,但我的问题是为什么 set 方法后跟类名。据我所知,Classname 用于创建构造函数。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 感谢 shakir,我了解您所描述的构造函数和类名。我知道我们为什么使用 setter。但是我有一个示例代码,并且在该代码中,我设置了方法后跟类名,正如我在代码中所描述的那样。这个类名让我很困惑。我知道 classname 是一个构造函数,但为什么要使用 set 方法?
【解决方案3】:

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

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

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

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

instanceOfYourClass.seconds = 60;

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

instanceOfYourClass.setSeconds(60);

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

【讨论】:

  • 代码有一些变化。请立即检查。
【解决方案4】:

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

public class Mymainclass {

private Mysecondclass sec= null;

public void setSec(Mysecondclass second){

        this.sec= second;
   }
}

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

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

【讨论】:

  • 代码有一些变化。请立即检查。
猜你喜欢
  • 2016-09-24
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2016-12-28
相关资源
最近更新 更多