在getter / setter中指定方法

时间:2013-05-21 09:45:44

标签: java encapsulation pojo

要真正理解封装的含义,必须通过类公共方法访问类私有字段的示例是按照定义,但实际上它不会产生差异,因为字段仍可按原样访问。
因此,我认为应该在getter / setter中进行一些处理以隐藏字段的处理方式。但它打破了pojos背后的原则。怎么能处理这种情况呢?

7 个答案:

答案 0 :(得分:3)

我不确定根据你的是“POJO的原则”。以下是POJO,仍然隐藏了getter和setter背后的实现细节:

public class Example {
    private int thousands;
    private int units;

    public void setValue(int value) {
        thousands = value / 1000;
        units = value % 1000;
    }

    public int getValue() {
        return 1000 * thousands + units;
    }
}

答案 1 :(得分:1)

封装表示不公开您班级的内部。

在Java上下文中,它意味着您的类的属性不应该被其他类访问,而是您的类应该提供允许访问属性的方法。在POJO类的情况下,这些方法只允许设置( setters )并获取( getters )POJO类中属性的值。

封装的目标是保护您的类的属性不被其他类修改。您的班级显然能够使用您班级中的属性做任何您想做的事情。

答案 2 :(得分:0)

不,该字段不可访问。使方法成为getter或setter所需要的只是正确的签名。

public String getFoo() {
  return null;
}

这是String foo的完美吸气剂,即使它返回null

public void setFoo(String foo) {
  // do nothing
}

这是同一个成员的完美设定者,即使它什么都不做。

答案 3 :(得分:0)

getter和setter的众多用途之一是限制变量的值。通过使数据成员保密并使getter和setter保持公共状态,程序员可以检查变量的值。例如:

class Employee
{
    private int age;

    public int getAge()
    {
        return this.age;
    }

    public void setAge(int age)
    {
        if(age<18 || age>60)
            this.age = age;
        else
            System.out.println("The age of the employee should be between 18 and 60");
    }
}

在这种情况下,员工的年龄不能低于18岁,超过60岁。

答案 4 :(得分:0)

不知道为什么人们通常将数据封装与数据隐藏混合在一起。数据封装只是意味着将数据分组在一起,而数据隐藏是一种存储这些数据的方式,因此其他人无法知道它的内部实现。

假设您有一个PersonalInfo类,其中包含名称,性别,年龄等字段。作为程序员(您是),您将为用户提供一些输入这些字段的方法,使用setter将它们保存在PersonalInfo对象中methods.IF用户希望看到您简单调用getter和显示信息的信息。您在此处的实现可能会将此变量存储在地图中,这可能是varry。所以你可以说

public void setName(String name){
  SomeMap.add("name",name);
}

注意* 您是程序员,您将始终了解实现 * n。将字段保密是仅允许您的类方法访问您的数据。

想象一下这样。用户可以创建一个对象。他可以使用getter和setter来设置所有字段。使用DOB(出生日期)计算年龄可能是您的实施,在这种情况下,您不会提供年龄的设定者。在这种情况下,用户不能说myObj.age = 23。这纯粹是你的实现。希望这可以解决这个困惑!

答案 5 :(得分:0)

它仍然可以访问但你看到当你直接使用它(公共变量)时你可以不受任何限制地改变变量的值。使用setter和getter方法使用这种私有变量的优点是可以在setter方法中编写代码来检查值集是否在预期范围内。或者您甚至可以以不同于明显视图的形式存储值。例如,您可以通过将偏移量添加到setter方法的参数值来存储变量的值,而在getter方法中,您可以恢复该过程(Encapsulation)。当值集不在预期范围内时,您甚至可能抛出异常。

例1:    这里var1是一个私有变量

public void setValue(int var1){
         if(var1<0){
                //throw exception
          }
         this.var1=var1;
 }

例2:

 public void setValue(int var1){
        this.var1=calculatesomething+var1;
}
public int getValue(){
        return calculatesomething+this.var1;
}

这是封装的使用.....所有最好的

答案 6 :(得分:-1)

封装是限制对类变量的访问,并规范编辑它们的方式。

Class Test
{
 public int a;
 public Test()
 {
  a = 0;
 }
 public getA()
 {
  return a;
 }

 public setA(int a)
 {
   this.a = a
 }
}

Class TestMain
{
  main()
 {
   Test t = new Test();
   System.out.println(t.a);   // This prints 0;
   int a = t.getA();
   a = 10;
   System.out.println(t.a);   // This still prints 0;

   t.a = 20;
   System.out.println(t.a);   // This prints 20;
 }
}

在上面的示例中,程序员可能无意故意更改t.a的值,但值会更改。

如果他真的打算改变它,那么他应该使用setter。

封装是java提供的功能,它解决了某些实际问题并有助于扩展性。

如果Test和TestMain类是由同一个人编写的,那么不会有任何混淆。 但实际情况并非如此。