使用getter和setter(只获取和设置)而不是简单地为这些变量使用公共字段有什么好处?
如果getter和setter所做的不仅仅是简单的get/set,我可以很快地解决这个问题,但我不是100%清楚如何做到:
public String foo;
比:
private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }
而前者需要的样板代码要少得多。
如果您不需要任何验证,甚至不需要维护状态,即一个属性依赖于另一个属性,那么当一个属性发生更改时,我们需要维护状态。您可以通过公开字段而不使用getter和setter来保持简单。
我认为OOP会随着程序的增长而使事情变得复杂,这对于开发人员来说是一场噩梦。
一个简单的例子;我们从xml生成c++头。标头包含不需要任何验证的简单字段。但仍然像OOPS访问器一样,我们生成它们的方式如下。
const Filed& getfield() const
Field& getField()
void setfield(const Field& field){...}
这是非常冗长的并且不是必需的。一个简单的
struct
{
Field field;
};
足够且可读。函数式编程没有数据隐藏的概念,它们甚至不需要它,因为它们不会改变数据。
我想发布一个我刚刚完成的真实世界示例:
背景-我使用休眠工具为我的数据库生成映射,这是一个我在开发时正在更改的数据库。我更改数据库模式,推送更改,然后运行hibernate工具来生成java代码。在我想向这些映射实体添加方法之前,一切都很好。如果我修改了生成的文件,则每次对数据库进行更改时都会覆盖这些文件。所以我这样扩展生成的类:
package com.foo.entities.custom
class User extends com.foo.entities.User{
public Integer getSomething(){
return super.getSomething();
}
public void setSomething(Integer something){
something+=1;
super.setSomething(something);
}
}
我上面所做的是用我的新功能(something+1)覆盖超类上的现有方法,而不需要接触基类。如果你在一年前写了一个类,并且想在不改变基类的情况下升级到第2版(测试噩梦),也是同样的情况。希望这会有所帮助。
如果您不需要任何验证,甚至不需要维护状态,即一个属性依赖于另一个属性,那么当一个属性发生更改时,我们需要维护状态。您可以通过公开字段而不使用getter和setter来保持简单。
我认为OOP会随着程序的增长而使事情变得复杂,这对于开发人员来说是一场噩梦。
一个简单的例子;我们从xml生成c++头。标头包含不需要任何验证的简单字段。但仍然像OOPS访问器一样,我们生成它们的方式如下。
const Filed& getfield() const
Field& getField()
void setfield(const Field& field){...}
这是非常冗长的并且不是必需的。一个简单的
struct
{
Field field;
};
足够且可读。函数式编程没有数据隐藏的概念,它们甚至不需要它,因为它们不会改变数据。