This question already has answers here:
Set and Get Methods in java?
                                
                                    (15个答案)
                                
                        
                5年前关闭。
            
        

在我的CS课上,我只是在学习课和OOP。

因此,当您创建类时,将初始化一定数量的私有变量。

我知道您将它们设为私有,因为如果它们是公开的,它们很容易更改,并且可能导致许多错误。

因此,我们使用get和set方法来更改变量。但这又使变量非常容易更改,对吗?那么首先将它们私有化有什么意义呢?

最佳答案

使用getter和setter(称为encapsulationdata-hiding)的一些好处:


  1.可以将类的字段设置为只读(仅通过提供getter)或仅写(通过仅提供setter)。这使该类可以完全控制谁可以访问/修改其字段。


例:

class EncapsulationExample {
    private int readOnly = -1;  // this value can only be read, not altered
    private int writeOnly = 0;    // this value can only be changed, not viewed
    public int getReadOnly() {
        return readOnly;
    }
    public int setWriteOnly(int w) {
        writeOnly = w;
    }
}



  2.类的用户不需要知道该类实际如何存储数据。这意味着数据是分离的并且独立于用户而存在,从而使代码更易于修改和维护。这使维护人员可以在不影响用户的情况下进行频繁的更改,例如错误修复,设计和性能增强。
  
  此外,封装的资源可为每个用户统一访问,并且具有独立于用户的相同行为,因为此行为是在类中内部定义的。


示例(获取值):

class EncapsulationExample {
    private int value;
    public int getValue() {
        return value; // return the value
    }
}


现在,如果我想返回值的两倍呢?我可以更改我的吸气剂,使用我的示例的所有代码都不需要更改,并且将获得两倍的值:

class EncapsulationExample {
    private int value;
    public int getValue() {
        return value*2; // return twice the value
    }
}



  3.使代码更简洁,更具可读性且更易于理解。


这是一个例子:

没有封装:

class Box {
    int widthS; // width of the side
    int widthT; // width of the top
    // other stuff
}

// ...
Box b = new Box();
int w1 = b.widthS;  // Hm... what is widthS again?
int w2 = b.widthT;  // Don't mistake the names. I should make sure I use the proper variable here!


带封装:

class Box {
    private int widthS; // width of the side
    private int widthT; // width of the top
    public int getSideWidth() {
        return widthS;
    }
    public int getTopWIdth() {
        return widthT;
    }
    // other stuff
}

// ...
Box b = new Box();
int w1 = b.getSideWidth(); // Ok, this one gives me the width of the side
int w2 = b.getTopWidth(); // and this one gives me the width of the top. No confusion, whew!


在第二个示例中,您将了解您对所获取的信息有更多的控制权,以及这些信息有多清晰。请注意,此示例很简单,在现实生活中,您将要处理的类涉及许多资源,这些资源可被许多不同的组件访问。因此,封装资源可以使我们更清楚地访问哪些资源以及以何种方式(获取或设置)。

这是关于此主题的good SO thread

这是关于数据封装的good read

10-05 22:22