您将如何从对象方法中访问对象属性?

从不是 getter/setter 方法的对象方法中访问对象属性的“纯粹”或“正确”方式是什么?

我知道从对象外部你应该使用 getter/setter,但从内部你会这样做:

Java:

String property = this.property;

PHP:

$property = $this->property;

或者你会这样做:

Java:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

如果我的 Java 有点不对,请原谅我,我已经一年没有用 Java 编程了......

编辑:

似乎人们假设我只是在谈论私有或受保护的变量/属性。当我学习 OO 时,我被教导要为每个属性使用 getter/setter,即使它是公开的(实际上我被告知永远不要公开任何变量/属性)。所以,我可能从一开始就从一个错误的假设开始。似乎回答这个问题的人可能是说你应该有公共属性,那些不需要 getter 和 setter,这与我所学的和我所说的背道而驰,尽管也许这需要讨论为好。不过,这可能是另一个问题的好话题...

请先 登录 后评论

10 个回答

pix0r
<块引用>

我只是在这里过火了吗?

也许;)

另一种方法是使用私有/受保护的方法来实际进行获取(缓存/数据库/等),并使用一个公共包装器来增加计数:

PHP:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

然后从对象本身内部:

PHP:

$name = $this->_getName();

通过这种方式,您仍然可以将第一个参数用于其他用途(例如发送一个标志,指示是否在此处使用缓存数据)。

请先 登录 后评论
Shawn

这取决于属性的使用方式。例如,假设您有一个具有 name 属性的 student 对象。如果尚未检索到名称,您可以使用 Get 方法从数据库中提取名称。这样您就可以减少对数据库的不必要调用。

现在假设您的对象中有一个私有整数计数器,用于计算名称被调用的次数。您可能不想在对象内部使用 Get 方法,因为它会产生无效计数。

请先 登录 后评论
Telcontar

我可能是错的,因为我是自学者,但我从不使用 Java 类中的公共属性,它们始终是私有的或受保护的,因此外部代码必须由 getter/setter 访问。更好地用于维护/修改目的。对于内部类代码...如果 getter 方法是微不足道的,我会直接使用属性,但我总是使用 setter 方法,因为如果我愿意,我可以轻松添加代码来触发事件。

请先 登录 后评论
Brendon-Van-Heyzen

我发现使用 setter/getter 使我的代码更易于阅读。我也喜欢它在其他类使用这些方法时提供的控制,如果我更改属性将存储的数据。

请先 登录 后评论
Greg Hurlman

这有宗教战争的潜力,但在我看来,如果你使用 getter/setter,你也应该在内部使用它——同时使用两者会导致后续的维护问题(例如有人将代码添加到每次设置该属性时都需要运行的 setter,并且该属性正在内部设置而无需调用该 setter)。

请先 登录 后评论
MojoFilter

就我个人而言,我觉得保持一致很重要。如果您有 getter 和 setter,请使用它们。我直接访问字段的唯一时间是访问器有很多开销。你可能会觉得你不必要地膨胀了你的代码,但它肯定可以在未来避免很多麻烦。经典例子:

稍后,您可能希望更改该字段的工作方式。也许它应该即时计算,或者您想为后备存储使用不同的类型。如果您直接访问属性,那么像这样的更改可能会一次性破坏大量代码。

请先 登录 后评论
Mel

具有公共或受保护属性的私有字段。对值的访问应该通过属性,如果它们将在一个方法中多次使用,则将它们复制到局部变量。如果且仅当您对应用程序的其余部分进行了如此彻底的调整、调整和其他优化,以便通过关联属性访问值已成为瓶颈(我保证这永远不会发生,我保证)您是否应该开始考虑让属性以外的任何东西直接接触它们的支持变量。

.NET 开发人员可以使用自动属性来强制执行此操作,因为在设计时您甚至看不到支持变量。

请先 登录 后评论
Coincoin

嗯,好像用 C

请先 登录 后评论
Allain Lalonde

如果“纯粹主义者”是指“最封装”,那么我通常将所有字段声明为私有,然后在类本身中使用 this.field,但所有其他类(包括子类)使用 getter 访问实例状态.

请先 登录 后评论
svrist

正如一些评论中所述:有时你应该,有时你不应该。关于私有变量的重要部分是,当您更改某些内容时,您可以看到它们被使用的所有地方。如果你的 getter/setter 做了你需要的事情,就使用它。如果你决定不重要。

相反的情况可能是,如果您使用 getter/setter 并且有人更改了 getter/setter,他们必须分析内部使用 getter 和 setter 的所有位置,以查看是否有问题。

请先 登录 后评论
  • 1 关注
  • 0 收藏,228 浏览
  • cmcculloh 提出于 2019-03-30 02:05