Java 中的访问器和修改器
Accessor and Mutator in Java
例如在 main 方法中我有 setFirstName()
并调用 Contact class 来执行此操作。
在联系人中 class 我知道我应该使用:public String getName()
然后 public void setFirstName(String name)
我知道这是正确的方法。
但是相反,我发现如果我这样做:
public String setFirstName(String name)
{
return this.name=name;
}
这也行,我不需要使用getName()
方法。
谁能帮我看看这是为什么?我的accessor/mutator方法正确吗?
getter 和 setters 只是一个约定。编译器不会特别识别它们,或类似的东西。
一个getter,例如public String getFirstName() {return this.name;}
,只是一个returns字段值的方法。
A setter,例如public void setFirstName(String name) {this.name=name;}
,只是一种将字段的值设置为其参数的方法。
没有什么强迫您创建 getter 和 setter,如果您不这样做,或者如果您决定以不同的方式实现它们,也不会发生什么坏事。它们通常以这种特定方式编写的原因是它在大多数时间都运行良好。但你不必这样做。
您创建了一个方法:
- 将
name
字段的值设置为其参数。
- Returns
name
字段的值。
没有错,这是一个完全有效的方法。
它作为 setter 有用吗?当然,它设置了值。
它作为 getter 有用吗?不 - 告诉我,您将如何使用它来获取此人的名字?
但它是一个完全有效的方法,它不是 "right" 或 "wrong",它只是不是特别有用。
访问器的理念就是只读不修改。这是一个有用的约定,因为如果始终如一地完成,它会使推理一些您不了解的代码变得容易得多。通常,您不必期待名为 getX()
的东西会产生奇怪的副作用。做一些懒惰的初始化可能是可以的,但是如果这样的 "lazy getters" 被命名为 getOrCreateX()
或者类似的给用户一个提示,第一次使用可能需要一点 longer/involve 一些昂贵的操作。
一个 returns 东西的突变体可能有用,但如果你以一种提示它是什么的方式命名它,它将帮助你的 class 的用户 return秒。是错误代码还是之前的值?人们不希望从名为 setX()
的东西中获得 return 值,因此他们会惊讶地看到这样的签名,并且必须查看 class 的文档以了解它的作用。
总结:总是像其他人随时必须接管你的代码一样编写代码 - 不要做会令人惊讶的事情。即使您从未将您的代码交给任何其他人,您未来的自己也会感谢您选择能够解释该方法功能的名称。
注意:您对 setter 的实现不是很有用,因为它总是 return 是您刚传入的新值。
setter 和 getter 必须正确实现,因为某些框架依赖于它们才能正常运行。
Mockito 等模拟框架、DI 框架和一些 xml 序列化技术依赖于 set 和 get 方法。
例如在 main 方法中我有 setFirstName()
并调用 Contact class 来执行此操作。
在联系人中 class 我知道我应该使用:public String getName()
然后 public void setFirstName(String name)
我知道这是正确的方法。 但是相反,我发现如果我这样做:
public String setFirstName(String name)
{
return this.name=name;
}
这也行,我不需要使用getName()
方法。
谁能帮我看看这是为什么?我的accessor/mutator方法正确吗?
getter 和 setters 只是一个约定。编译器不会特别识别它们,或类似的东西。
一个getter,例如public String getFirstName() {return this.name;}
,只是一个returns字段值的方法。
A setter,例如public void setFirstName(String name) {this.name=name;}
,只是一种将字段的值设置为其参数的方法。
没有什么强迫您创建 getter 和 setter,如果您不这样做,或者如果您决定以不同的方式实现它们,也不会发生什么坏事。它们通常以这种特定方式编写的原因是它在大多数时间都运行良好。但你不必这样做。
您创建了一个方法:
- 将
name
字段的值设置为其参数。 - Returns
name
字段的值。
没有错,这是一个完全有效的方法。
它作为 setter 有用吗?当然,它设置了值。
它作为 getter 有用吗?不 - 告诉我,您将如何使用它来获取此人的名字?
但它是一个完全有效的方法,它不是 "right" 或 "wrong",它只是不是特别有用。
访问器的理念就是只读不修改。这是一个有用的约定,因为如果始终如一地完成,它会使推理一些您不了解的代码变得容易得多。通常,您不必期待名为 getX()
的东西会产生奇怪的副作用。做一些懒惰的初始化可能是可以的,但是如果这样的 "lazy getters" 被命名为 getOrCreateX()
或者类似的给用户一个提示,第一次使用可能需要一点 longer/involve 一些昂贵的操作。
一个 returns 东西的突变体可能有用,但如果你以一种提示它是什么的方式命名它,它将帮助你的 class 的用户 return秒。是错误代码还是之前的值?人们不希望从名为 setX()
的东西中获得 return 值,因此他们会惊讶地看到这样的签名,并且必须查看 class 的文档以了解它的作用。
总结:总是像其他人随时必须接管你的代码一样编写代码 - 不要做会令人惊讶的事情。即使您从未将您的代码交给任何其他人,您未来的自己也会感谢您选择能够解释该方法功能的名称。
注意:您对 setter 的实现不是很有用,因为它总是 return 是您刚传入的新值。
setter 和 getter 必须正确实现,因为某些框架依赖于它们才能正常运行。
Mockito 等模拟框架、DI 框架和一些 xml 序列化技术依赖于 set 和 get 方法。