我的教授真的强调通过始终使用访问器和更改器访问私有实例变量来防止隐私泄露; 但是,我是否必须使用类中的类的getter / setter?

例如,如果我有以下类:

public class Person 
{
    private String name;
    private int age;
}

我想为它编写一个toString()方法。 我可以写一下:

public String toString()
{
    return name + " " + age;
}

或者我需要做这样的事情:

public String toString()
{
    return this.getName() + " " + this.getAge();
}

===============>>#1 票数:36 已采纳

你可以做任何一个。 但是,您的教授可能会喜欢使用这些方法而不是直接访问。 这就是原因。

假设你有一个这样的类:

class SomeClass {
    private int someValue;
    private String someString;

    public SomeClass(int someValue, String someString) {
        this.someValue = someValue;
        this.someString = someString;
    }

    public int someValue() {
        return someValue;
    }

    public int someString() {
        return someString;
    }

    public String toString() {
        return someValue + ": " + someString;
    }

}

这很简单,对吧? 那么,如果我们突然想要改变我们如何计算someValue的实现,并将其基于someString ,那该怎么someValue呢?

public int someValue() {
    int value = 0;
    for(int i = 0; i < someString.length; i++) {
         if(someString.charAt(i) == ' ') value++;
    }
    return value;
}

现在,您还必须更改使用变量someValue每个位置。

因此,如果您希望从长远来看使代码更易于维护,请使用方法调用。 这样,当您对自己进行代码更改(并相信我,它会一直更改)时,您只需要在一个位置而不是两个位置进行更改。

是的,你想在最后一个方法中使用方法调用来获取someString而不是直接访问:-)

===============>>#2 票数:19

当我设计一个类时,我试图明确区分内部(实现细节)和外部(暴露给世界的接口)。 getter和setter提供了一个方便的位置,可以在存储在对象实例成员中的表单与外部世界看到它们的表单之间转换值。 在内部使用getter和setter会破坏它,因为它们会被内部和外部使用。

如果您发现自己想要从同一个类的另一部分隐藏一部分类,请考虑将要隐藏的部分分解为自己的类。

===============>>#3 票数:15

由于多种原因,这通常不是一个好主意:

  • 您可能甚至不想要所有字段的访问者
  • 一些访问者可能会制作一个防御性副本,以免暴露内部状态,这通常是在你不知道你不会修改它的类中是不必要的 - 或者如果你知道你要修改它就是完全错误的
  • 它使调试更烦人,因为你必须遵循getter / setter
  • 它使得在大多数IDE中更难以读取代码,因为它们中的大多数颜色字段与局部变量不同

......但与往常一样,也有例外。 有些setter可能有你想要执行的副作用(例如设置第二个值),那么使用setter可能会更好。 此外,如果您将类设计为继承,如果您希望子类能够更改行为,则最好通过访问器。

===============>>#4 票数:7

一般来说,没有。 如果你的getter返回的字段不是字段的值,那么你应该使用该方法,但在极少数情况下,你的方法应该有一个更具描述性的名称。 举个不好的例子,如果你有:

public void setName(String name)
{
  _name = name;
}

并且你的getter返回了别的东西,比如

public String getName()
{
  return _name.toUpperCase();
}

那么是的,你应该使用吸气剂。 不过,为getter设置更具描述性的名称会更好:

public String getNameAsUppercase()
{
  return _name.toUpperCase();
}

===============>>#5 票数:5

可以使用访问器和更改器,但它遵循一个混乱的标准。

它会使你的代码变得混乱,并使任何试图阅读它的人感到困惑,认为它可能不是你班级的一部分。

基本上,只需直接从类内部访问变量,间接访问其他任何变量。

===============>>#6 票数:5

不,你没有。 您可以从类中访问任何变量,private,public或protected。

以下是一些可以帮助您的表:

在此输入图像描述

资料来源:Java教程

===============>>#7 票数:3

另一方面,从设计的角度考虑它。 getter / setter的一个动机是底层数据存储可以改变,实现该类的东西不需要更改,因为它是封装的。

因此,记住这一点,在类中使用getter / setter可以使未来的更改更容易。 您必须更改getter / setter,而不必直接找到更改成员的所有位置。 根据类的复杂性,这可能会显着减少更改存储成员所需的工作量。

例如,假设您从年龄开始使用年龄变量。 然后由于某种原因,您稍后决定将其存储为秒。 但是你想要总是多年打印它。 所以在你的例子中,你可以在你的toString()函数中(以及任何需要多年作为单位的地方)进行数学运算,或者你可以在getAge()例程中改变数学,从秒开始返回几年,没有别的东西。改变。

显然这个例子有点微不足道。 类越复杂,在其中使用getter / setter就越有用。

===============>>#8 票数:3

如果您的类(或相关的访问器方法)不是final ,那么您一定要使用访问器方法。

如果另一个类扩展了您的类并覆盖了这些访问器,那么您的类应该使用重写的访问器。 如果这会破坏你的超类,那么你的超类设计不正确; 防止这些访问者被final覆盖,或者改变你的类的设计。

===============>>#9 票数:1

如果存在getter和setter,那么应该总是在class里面使用。 当然,如果getter和setter在方法上做了更多的事情,那么必须考虑它是否满足了需求。

应该使用不是必须使用的手段。 属性可以直接使用(如果属性是私有的,则只在内部类中 - 应该是)但在实践中是使用getter和setter。

因此可以直接使用属性,但我建议使用getset因为它提供了更多的灵活性,并且可以做更多的事情而不是tipical assign或get。

例如,如果在第一位置setter只设置一些东西,但在一段时间之后setter被改变以做更多的事情。

 setName(name){

     this.name=name;
 }

所以在代码setName("John"); 是等name="John" 但想象一下,我们想在设置name时设置另一个属性:

 setName(name){

     this.name=name;
     this.nameIsSet=true;
 }

另一个例子(听众模式)

setName(name){

     this.name=name;
     this.listener.nameChanged(this.name); //we call listener that variable changed
 }

然后程序员需要在类中查找name="John"每个分配,并将其重构为新行为。 如果仅使用setName ,则不必更改代码。

当然,一切都取决于需求,并且可能设置,从外部获取属性做更多和更多的事情,它不能满足我们在课堂上的需要。

===============>>#10 票数:1

不,你可以直接在类中使用你的实例变量,你没有违反任何“规则”。 其他类必须使用getter和setter来访问类的实例变量,以免违反封装原则(这在OO编程中非常重要)。

最后,这是一个选择问题,但是您使用第一个示例保存了一个方法调用。

===============>>#11 票数:0

我认为我们应该使用getters()和setters()而不是直接访问。 它也使调试变得非常容易。 例如,如果您需要在类中分配一个变量多个位置,之后您想要找到变量分配的位置,那么您需要找到所有赋值并设置断点。

但是如果使用setter,你可以简单地在setter方法中放置一个断点,并查看变量分配的时间。

===============>>#12 票数:0

我使用两者的混合。 访问器方法增加了更多的混乱,所以我只在多次使用变量时才使用它们。 如果变量只使用一次或两次,我就不使用它们。

  ask by LTH translate from so

未解决问题?本站智能推荐:

3回复

Java Getter Setter代码样式

在bean的上下文之外,反射,自省或任何其他经常引用的废话,是否有重要的原因导致Java Getter / Setter始终被标记为Type getAttribute()和void setAttribute(Type a)吗? 最近我读和写了很多C ++代码,回到Java时,我突然感到迫切
14回复

Java getter / setter样式问题

我有一个关于Java风格的问题。 我已经编程Java多年了,但主要是出于我自己的目的,在那里我不必担心风格,但我只是没有找到一份工作,我必须专业地使用它。 我问,因为我要让人们第一次真正查看我的代码,我想看起来我知道自己在做什么。 嘿。 我正在开发一个其他人会在我的工作中使用的图书馆
4回复

我必须在自己的Java类中使用getter方法吗?

说我有一些课: 我应该改用getter方法来使用otherA的val变量吗? 这样做更好吗? 编辑:这是一个类的非常简化的版本,需要花费很长时间阅读。 但是,假设正在进行惰性初始化,还有其他方法可以访问此类,等等。我已经更新了示例方法,以便使它更清晰,但我希望我的问题很明显涉及
8回复

对于布尔字段,其getter / setter的命名约定是什么?

例如。 你怎么命名它的吸气剂和二传手?
1回复

使用Lombok @Getter和@Setter维护变量的命名标准

我使用的代码库使用每个局部变量的命名标准以's'或'f'开头,例如fName或sName。 当我使用Lombok @Getter注释时,它最终将函数命名为getFName()或getSName(),这看起来并不漂亮。 在使用Lombok时,您对如何维护命名准则/标准有任何建议或建议吗?
15回复

Java中getter / setter的用途是什么? [重复]

这个问题在这里已有答案: 为什么要使用getter和setter / accessors? [已关闭] 38个答案 我已经看到成员变量给出了私有修饰符,然后使用getter / setter方法来设置和获取变量的值(在标准化的名称中)。 那么为什么不将变量公
3回复

Java中的setter约定(返回void或this)

我已经写了近一年的Java了,我已经看到了两种不同的约定,用于人们如何实现他们的setter。 为了说明这一点,以下是两种惯例的示例。 (我也很想知道这两个模式的简洁名称) 使用第一个约定的类,不返回其“set”方法。 像这样: 使用替代约定的类从其setter方法返回。
6回复

在同一个类的其他方法中使用get方法的Java约定是什么?

在java类中编写get方法之后,在同一个类或变量本身中使用get方法会更好吗? 例如: 要么: 我也很困惑,如果我应该使用this.anything这么多。 在将相同类型的对象相互比较时,读起来似乎更容易。
1回复

带Setter或布尔型Getter的变量

假设我有一个名为isConnected的实例变量和一个名为checkConnection的方法。 我可以拥有: 实例变量isConnected和方法void checkConnection()设置isConnected变量。 要么 只有布尔方法bool checkConnec
4回复

布尔型getter / setter方法和属性的语法

在编写布尔型getter / setter方法时,像这样写它们似乎是标准的 但是,我看到了一些用法,该用法指出应根据其用法适当地命名getter方法。 例如,假设我要设置/获取一个名为“ enabled”的布尔值,那么我的getter应该被称为: 要么 再说一次,例