Java setter和getter?

时间:2012-02-08 13:01:33

标签: java getter-setter

每个人都知道Java支持数据隐藏。

我去接受采访。然后面试官问我,如果Java使用private作为数据类型支持数据隐藏。

他说,如果我们在该课程中使用setter和getter,那么通过使用这些setter和getter,我们可以轻松获得私有数据。

那么这是如何支持数据隐藏的呢?

他有可能试图让我抓住陷阱。但我无法回复此事。

我应该回答什么?

13 个答案:

答案 0 :(得分:5)

他辩称,如果" Data Hiding"是一个OOP原则,然后我们不通过getter和setter暴露它来打破它。我想他希望你能说明直接访问数据成员与通过getter或setter进行数据成员之间的原则差异。在前一种情况下,类的客户端可能会错误处理数据,为其分配一个类设计器尚未设计要处理的类(例如,将学生的年龄设置为500)。 在后者(使用setter)中,类设计者对可以分配给数据的值施加了某些限制。在年龄示例中,setter可能类似于:

void setAge(int age) {
if(age<3 || age>100) 
  return;
this.age=age;
}

假设年龄在3岁以下且100岁以上的学生不被允许。因此,您仍然隐藏数据,但允许以与模块逻辑一致的方式操作数据。

答案 1 :(得分:4)

非常简单示例:

类的第1版可能有这样的getter。

public int getTotal() {
   return total_;
}

版本2可以做到这一点

public int getTotal() {
  return a + b;
}

我们已经改变了类的实现方式,但是类的客户端也不需要改变,因为数据隐藏在getter之后。

答案 2 :(得分:2)

数据隐藏是坏词,更好的说数据封装。在Java中,私有成员的访问是通过访问器和变更器(getter和setter)完成的,它完全是为了隐藏和控制对你的成员的访问,这样你就可以控制如何修改实例的内部状态。

我想如果你提到一些关于java反射/元数据的东西 - &gt;你会得到奖励积分

答案 3 :(得分:2)

如果我们声明它们private,则隐藏类字段。毫无疑问(我们忽略讨厌的反思技巧)。如果我们想要使可访问,我们提供访问方法(例如getter / setter)。

但是没有要求为所有字段提供getter和setter,或者根据字段(通常)命名它们。

类内部(字段)完全隐藏。

答案 4 :(得分:2)

protected String name;

public void setName(String newName){
    if(newName.length() > 5) this.name = newName
}

public String getName(){
    return this.name;
}

在这个简单的例子中,name属性可以通过它在这个类及其所有子节点中的名称来访问。如果您要从不相关的类中设置name的值,则必须使用setName()方法,例如,您可以应用某些验证。

Here您可以找到有关此特殊方法的任何信息。

请注意,如果mutator和访问器为public,则可以访问类的任何属性。这是Java Bean概念的关键点之一,几乎所有java框架都与这个概念有关。

答案 5 :(得分:1)

对“数据隐藏”的支持可以通过getter和setter方法就像数据的网关这一事实来解释。

只有按照惯例 - 确切地说JavaBeans convention - 期望他们对他们命名的成员进行操作。他们可以做任何事情,而且它仍然是完全可编译和合法的java。

答案 6 :(得分:1)

你所说的似乎是Encapsulation。基本上,getter和setter允许您根据需要公开类变量并隐藏任何其他变量。 Getters和Setter还允许您执行任何其他必要的步骤,例如验证。

Getters和Setter本身可以有不同的访问修饰符,因此您可以使用不同的访问修饰符将数据暴露给某些类而不是其他类。

答案 7 :(得分:1)

我打赌他在等你也会提到“不可变”的类型。

PD。 private 不是类型,它是一个访问修饰符。

答案 8 :(得分:0)

也许,他的意思是Encapsulation作为信息隐藏。

答案 9 :(得分:0)

如果你制作了setter&amp; getter public / protected / default,然后你可以访问不同级别的私有成员..如果你使setter&amp; getter私有,那么数据真的是隐藏的。最后一种方法完全没有任何意义

答案 10 :(得分:0)

您可以通过多种方式考虑实现set / get方法。

答案 11 :(得分:0)

正如一些答案已经指出的那样,set / get不必实际设置或返回实际成员。

例如,假设您有一个带有set / get for(x,y)的Coordinate类。内部实现可能基于极坐标:

private double radius;
private double angle;

和(x,y)的get / set用sin和cos做一些坐标转换。

您可以随意将类的实现更改为任何其他坐标系,并且仍然将(x,y)的set / get保留为公共方法。

因此,总而言之,我对问题的回答是:类的公共接口可能提供set / get,但实际的实现可以(并且应该)通过使所有成员成为私有(或受保护)来隐藏。所以我们可以说公共设置/获取私有数据是“实现隐藏”而不是数据隐藏。

答案 12 :(得分:0)

数据隐藏和封装经常被第一次oops学习者误认为安全。了解数据隐藏和封装与安全无关是很重要的。

这些概念的存在是为了确保类B的继承(B类扩展A)不会继承“封装”成员。

我希望这有助于澄清你的困惑,并激励你阅读和学习更多。您的问题是OOPS概念的基础。面试官并没有试图转过身来,但你会问你关于OOPS的非常基本的问题。努力学习!!!