在Java中,为什么将字段同时设置为公共的setter和getter方法是不好的?

21 浏览
0 Comments

在Java中,为什么将字段同时设置为公共的setter和getter方法是不好的?

考虑下面的Java代码:\n

public class SomeClass {
    private int data;
    
    public void setData(int data) {
        this.data = data;
    }
    
    public int getData() {
        return this.data;
    }
}

\n在上述代码中,data的值可以从任何地方访问。那么为什么不直接将data字段设为public呢?

0
0 Comments

在Java中,为什么将字段同时设置为公共的getter和setter是不好的?

即使现在看起来使用getter/setter方法没有意义,因为它们没有做任何有趣的事情,但你需要思考当需求改变时可能会发生什么。你可能会发现在设置值时需要添加一些验证;你可能会发现需要改变整个实现,使得“get”方法实际上从多个数据片段计算一个值,或者从文件中读取一个值,或者其他一些操作。当这种情况发生时,如果你有其他类直接访问data字段,你将会陷入困境。你将无法按照你需要的方式改变实现,而需要付出很大的痛苦。我从维护别人杂乱代码的长期苦涩经验中得出了这个结论。

问题的出现原因是:在字段上同时设置公共的getter和setter方法,可能会导致在需求变更时无法灵活修改实现,存在代码维护上的困难。

解决方法是:不要直接访问字段,而是通过使用私有的getter和setter方法来访问和修改字段的值。这样,当需求变更时,你可以自由地修改getter和setter方法的实现,而不需要修改其他类中直接访问字段的代码。这种封装的方式可以提高代码的灵活性和可维护性。

下面是一个示例代码,展示了如何使用私有的getter和setter方法来访问和修改字段的值:

public class MyClass {
    private int data;
    public int getData() {
        return data;
    }
    public void setData(int newData) {
        // 这里可以添加验证逻辑
        data = newData;
    }
}

通过这种封装的方式,当需求变更时,你可以轻松地修改getter和setter方法的实现,而不会影响其他类中访问字段的代码。这样,你就可以避免维护其他人杂乱代码的痛苦经历。

0
0 Comments

在Java中,为什么将字段同时设置为公共的setter和getter方法是不好的?

这是因为你可以控制其他类如何设置数据。你可以对输入进行检查,甚至根据一定的规则修改输入。

例如:

public class SomeClass{  
    private int data;  
    public void setData(int data){  
        if (data < 1000){
            this.data = data;  
        }
        else{
            data = -1;
        }
    }  
    public int getData(){  
        return this.data;  
    }
}

想象一下,如果你将所有的变量(不仅仅是基本类型)都设为公共的。你将不可避免地遇到一个障碍,无法仅仅将变量A设置为变量B,而不经过某种预处理。

为了解决这个问题,我们可以使用封装(Encapsulation)的概念。将字段设置为私有的,并提供公共的setter和getter方法来访问和修改字段。这样,我们可以在setter方法中进行输入验证和处理,确保数据的有效性。同时,我们可以在getter方法中对数据进行加工和转换,以便其他类能够以我们期望的方式使用数据。

通过使用封装,我们可以更好地控制数据的访问和修改,保证数据的一致性和安全性。这也提高了代码的可维护性和灵活性,使得我们可以在不影响其他类的情况下修改字段的实现细节。

因此,在Java中将字段同时设置为公共的setter和getter方法是不好的,通过封装的方式可以更好地解决这个问题。

0
0 Comments

在Java中为什么将字段同时设置为公共的setter和getter方法是不好的?

为什么需要getter和setter方法?

许多人想知道为什么我们需要在Java中使用访问器和修改器方法(即getter和setter),为什么不能直接访问数据?但是,封装的目的不是隐藏数据本身,而是隐藏操作数据的实现细节。因此,我们需要的是通过公共接口访问这些数据。我们可以在不影响类的公共接口的情况下更改数据的内部表示。相反,通过公开数据本身,我们破坏了封装,从而无法在不影响用户的情况下更改操作这些数据的方式。我们将与数据本身建立依赖关系,而不是与类的公共接口建立依赖关系。当“变化”最终找到我们时,这将导致麻烦。

为什么要封装对字段的访问?

我们可能有几个非常有说服力的原因需要封装对字段的访问。我发现的这些原因的最佳总结在Joshua Bloch的书《Effective Java》中描述的项目14中。在那里,他提到了几个原因,我在这里也提到了:

- 您可以限制可以存储在字段中的值(例如,性别必须为F或M)。

- 当字段被修改时,您可以执行操作(触发事件,验证等)。

- 您可以通过同步方法提供线程安全性。

- 您可以切换到新的数据表示(例如计算字段,不同的数据类型)。

- 您可以使字段只读。

- 等等。

然而,非常重要的是要理解封装不仅仅是隐藏字段。在Java中,我们可以隐藏整个类,从而隐藏整个API的实现细节。

我对这个重要概念的理解得到了Alan Snyder的一篇名为《封装和面向对象编程语言中的继承》的优秀文章的拓宽和丰富。我向所有读者推荐阅读这篇文章。

在Java中为什么将字段同时设置为公共的setter和getter方法是不好的?

封装的目的是隐藏数据的实现细节,而不是隐藏数据本身。因此,通过将字段设置为公共的setter和getter方法,我们破坏了封装,并且无法在不影响类的公共接口的情况下更改操作数据的方式。这将导致与数据本身而不是类的公共接口建立依赖关系,从而在“变化”时可能会遇到问题。

封装对字段的访问可以提供许多好处,如限制字段中存储的值,当字段被修改时执行操作,提供线程安全性,切换到新的数据表示等。因此,将字段设置为公共的setter和getter方法是不推荐的。

为了解决这个问题,我们应该将字段设置为私有,并提供公共的setter和getter方法来访问和修改字段的值。这样做可以实现封装,并且可以在不影响类的公共接口的情况下更改数据的内部表示。这种做法还可以提供更好的代码可维护性和灵活性。以下是一个示例:

public class MyClass {
    private int myField;
    
    public int getMyField() {
        return myField;
    }
    
    public void setMyField(int value) {
        myField = value;
    }
}

通过这种方式,我们可以通过公共的setter和getter方法来访问和修改字段的值,而不需要直接访问字段本身。这样可以保护字段的封装性,并且可以在需要时更改字段的内部表示,而不会影响类的公共接口。

总之,在Java中将字段同时设置为公共的setter和getter方法是不好的,因为这破坏了封装,并且无法在不影响类的公共接口的情况下更改操作数据的方式。通过将字段设置为私有,并提供公共的setter和getter方法,我们可以实现封装,并且可以更好地管理和修改字段的值。这样可以提高代码的可维护性和灵活性。

0