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

Java 如何从对象方法中访问对象属性?,java,php,oop,theory,Java,Php,Oop,Theory,从非getter/setter方法的对象方法中访问对象属性的“纯粹”或“正确”方法是什么 我知道,从对象外部,您应该使用getter/setter,但从内部,您只需执行以下操作: 爪哇: PHP: 或者你会: 爪哇: PHP: 如果我的Java有点不对劲,请原谅,我用Java编程已经一年了 编辑: 人们似乎认为我所说的只是私有或受保护的变量/属性。当我学习OO时,我被教导对每一个属性使用getter/setter,即使它是公共的(事实上,我被告知永远不要将任何变量/属性公开)。所以,我可能是从一

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

我知道,从对象外部,您应该使用getter/setter,但从内部,您只需执行以下操作:

爪哇:

PHP:

或者你会:

爪哇:

PHP:

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

编辑:


人们似乎认为我所说的只是私有或受保护的变量/属性。当我学习OO时,我被教导对每一个属性使用getter/setter,即使它是公共的(事实上,我被告知永远不要将任何变量/属性公开)。所以,我可能是从一个错误的假设开始的。看来,回答这个问题的人可能会说,你应该拥有公共财产,而这些财产不需要获得者和制定者,这违背了我所学到的,也违背了我所说的,尽管这可能也需要讨论。对于另一个问题来说,这可能是一个很好的话题,尽管…

这有可能引发宗教战争,但在我看来,如果您使用的是getter/setter,那么您也应该在内部使用它-使用两者都会导致以后的维护问题(例如,有人向每次设置该属性时都需要运行的setter添加代码,并且在内部设置该属性时不调用该setter).

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

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

我是不是太过火了

也许;)

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

PHP:

然后从对象本身内部:

PHP:

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

好吧,似乎C#3.0属性的默认实现为您做出了决定;您必须使用(可能是私有的)属性设置器设置属性


我个人只在不这样做会导致对象处于不理想的状态时才使用后面的私有成员,例如在初始化或涉及缓存/延迟加载时。

如一些评论中所述:有时应该,有时不应该。私有变量最重要的一点是,当您更改某些内容时,您可以看到它们被使用的所有位置。如果你的getter/setter做了你需要的事情,就使用它。如果没关系,你自己决定


相反的情况可能是,如果您使用getter/setter,而有人更改了getter/setter,他们必须分析getter和setter在内部使用的所有位置,以查看它是否会弄糟一些事情。

就我个人而言,我觉得保持一致性很重要。如果您有getter和setter,请使用它们。我唯一一次直接访问字段是在访问者有大量开销时。这可能会让人觉得你在不必要地膨胀你的代码,但它肯定会在将来省下很多麻烦。经典的例子是:


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

我可能是错的,因为我是autodidact,但我从未在Java类中使用公共属性,它们总是私有的或受保护的,因此外部代码必须由getter/setter访问。最好用于维护/修改目的。对于类内代码。。。如果getter方法很简单,我会直接使用属性,但我总是使用setter方法,因为如果我愿意,我可以轻松地将代码添加到激发事件中。

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

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


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

如果您指的是“purist”所指的“most封装”,那么我通常会将所有字段声明为私有字段,然后在类本身中使用“this.field”。对于其他类,包括子类,我使用getter访问实例状态。

如果我不编辑属性,我将使用公共方法
get\u property()
除非是特殊情况,例如另一个对象中的MySQLi对象,在这种情况下,我只会将该属性公开,并将其称为
$obj->object\u property

在对象内部,对我来说总是$this->property。

我喜欢的答案是,但它似乎是最正确的
String property = this.property;
$property = $this->property;
String property = this.getProperty();
$property = $this->getProperty();
public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}
$name = $this->_getName();
  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }
  doSomethingWithProperty( this.daysPerWeek() ) ;