【发布时间】:2011-01-03 11:09:15
【问题描述】:
我来自 php 世界。您能否解释一下什么是 getter 和 setter,并给您一些例子?
【问题讨论】:
-
@yegor256 我理解你的狗和球类比,我什至支持它,但是当“活的有机体”对象存储偶尔的原始值(例如 ID)时呢?如果您想超越简单的赋值,但又不想编写一个只处理原始值的新类怎么办?
我来自 php 世界。您能否解释一下什么是 getter 和 setter,并给您一些例子?
【问题讨论】:
教程并不是真正需要的。阅读encapsulation
private String myField; //"private" means access to this is restricted to the class.
public String getMyField()
{
//include validation, logic, logging or whatever you like here
return this.myField;
}
public void setMyField(String value)
{
//include more logic
this.myField = value;
}
【讨论】:
someObj.getTime().setHour(5),它不应该影响someObj 的内部状态。此外,setter 和 getter (访问器和 mutator 的名称更奇特) 具有非常严格的方法签名,这意味着 getter 没有任何参数。无论如何,一般方法应该只做一件事。
this 关键字是可选的,除非与具有更具体范围的内容发生冲突。在您给出的示例中,创建的 setter 将有一个参数,其名称与字段名称匹配,因此 this.fieldName = fieldName 用于区分该字段被分配给而不是参数被分配给其自身作为 @ 987654327@ 将实现。 getter 中不存在这样的冲突。
在 Java 中,getter 和 setter 是完全普通的函数。使它们成为 getter 或 setter 的唯一因素是约定。 foo 的 getter 称为 getFoo,而 setter 称为 setFoo。在布尔值的情况下,getter 称为 isFoo。它们还必须有一个特定的声明,如“name”的 getter 和 setter 示例所示:
class Dummy
{
private String name;
public Dummy() {}
public Dummy(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
使用 getter 和 setter 而不是公开您的成员的原因是它可以在不更改接口的情况下更改实现。此外,许多使用反射检查对象的工具和工具包只接受具有 getter 和 setter 的对象。 JavaBeans 例如必须具有 getter 和 setter 以及其他一些要求。
【讨论】:
error: invalid method declaration; return type required
class Clock {
String time;
void setTime (String t) {
time = t;
}
String getTime() {
return time;
}
}
class ClockTestDrive {
public static void main (String [] args) {
Clock c = new Clock;
c.setTime("12345")
String tod = c.getTime();
System.out.println(time: " + tod);
}
}
当你运行程序时,程序在电源中启动,
setTime()被对象c调用time设置为传递的值getTime()被对象c调用tod 和tod 被打印出来【讨论】:
您可能还想阅读“Why getter and setter methods are evil”:
尽管 getter/setter 方法在 Java 中很常见,但它们并不是特别面向对象 (OO)。事实上,它们会损害代码的可维护性。此外,大量 getter 和 setter 方法的存在是一个危险信号,从 OO 的角度来看,该程序不一定设计得很好。
本文解释了为什么不应该使用 getter 和 setter(以及何时可以使用它们),并提出了一种设计方法,可以帮助您摆脱 getter/setter 思维方式。
【讨论】:
这是一个来自 mozilla 的 javascript 示例:
var o = { a:0 } // `o` is now a basic object
Object.defineProperty(o, "b", {
get: function () {
return this.a + 1;
}
});
console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)
我经常使用这些,因为它们很棒。当我喜欢我的编码+动画时,我会使用它。例如,制作一个处理 Number 的设置器,它会在您的网页上显示该数字。当使用 setter 时,它使用tweener 将旧数字动画化为新数字。如果初始数字是 0 并且您将其设置为 10,那么您会看到数字从 0 快速翻转到 10,比方说半秒。用户喜欢这些东西,而且创造起来很有趣。
来自软的例子
<?php
class MyClass {
private $firstField;
private $secondField;
public function __get($property) {
if (property_exists($this, $property)) {
return $this->$property;
}
}
public function __set($property, $value) {
if (property_exists($this, $property)) {
$this->$property = $value;
}
return $this;
}
}
?>
引用:
【讨论】:
这里有一个例子来解释在java中使用getter和setter的最简单的方法。可以用一种更直接的方式做到这一点,但是 getter 和 setter 有一些特殊的地方,那就是在继承的子类中使用父类的私有成员时。您可以通过使用 getter 和 setter 来实现。
package stackoverflow;
public class StackoverFlow
{
private int x;
public int getX()
{
return x;
}
public int setX(int x)
{
return this.x = x;
}
public void showX()
{
System.out.println("value of x "+x);
}
public static void main(String[] args) {
StackoverFlow sto = new StackoverFlow();
sto.setX(10);
sto.getX();
sto.showX();
}
}
【讨论】: