使用getter和setter的优点是什么 - 只能获取和设置 - 而不是简单地使用公共字段来存储这些变量?
如果getter和setter做的不仅仅是简单的get/set,我可以非常快地解决这个问题,但我并不是100%清楚如何:
public String foo;
Run Code Online (Sandbox Code Playgroud)
更糟糕的是:
private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }
Run Code Online (Sandbox Code Playgroud)
而前者需要很少的样板代码.
我目前正在开发一个简单的Java游戏,有几种不同的模式.我扩展了一个主要的Game类,将主要逻辑放在其他类中.尽管如此,主要的游戏类仍然非常沉重.
在快速浏览一下我的代码后,其中大部分是Getters and Setters(60%),而其余部分则是游戏逻辑真正需要的.
一些谷歌搜索声称Getters和Setters是邪恶的,而其他人声称他们是良好的OO练习和伟大的程序所必需的.
所以我该怎么做?应该是哪个?我应该为我的私人变量更改我的Getters和Setter,还是应该坚持使用它们?
我知道它们有什么不同以及它们是如何工作的,但这个问题更多的是关于编码风格.
每当我编写代码时,我会创建很多类,它们都有变量,其中一些是指针,一些是正常变量.我通常更喜欢变量指针,如果成员持续和类一样长,但我的代码变成这样:
engine->camera.somevar->x;
// vs
engine->camera->somevar->x;
Run Code Online (Sandbox Code Playgroud)
我不喜欢中间的圆点.或者使用私有变量:
foo_.getName();
// vs
foo_->gatName();
Run Code Online (Sandbox Code Playgroud)
我认为这个点在长代码中"消失".我发现- >在某些情况下更容易阅读.
我的问题是如果你使用指针即使变量将在构造函数中创建并在析构函数中删除?在这种情况下有任何风格建议吗?
PS我认为在某些情况下,点看起来更好.
使用C++我构建了一个具有许多setter函数的Class,以及在运行时可以连续调用的各种函数.所以我最终得到的代码如下:
A* a = new A();
a->setA();
a->setB();
a->setC();
...
a->doA();
a->doB();
Run Code Online (Sandbox Code Playgroud)
不是,这很糟糕,但我不喜欢一遍又一遍地输入"a->".
所以我重写了我的类定义,如下所示:
class A{
public:
A();
virtual ~A();
A* setA();
A* setB();
A* setC();
A* doA();
A* doB();
// other functions
private:
// vars
};
Run Code Online (Sandbox Code Playgroud)
那么我可以像我一样初始化我的课程:( 方法1)
A* a = new A();
a->setA()->setB()->setC();
...
a->doA()->doB();
Run Code Online (Sandbox Code Playgroud)
(我更喜欢它,因为它更容易编写)
为了更精确地实现这一点,你可以看到我在http://ken-soft.com/?p=234上写的SDL Sprite C++ Class
一切似乎都很好.但是,我对这种方法的任何反馈感兴趣.我注意到一个问题.如果我初始化我的班级:( 方法2)
A a = A();
a.setA()->setB()->setC();
...
a.doA()->doB();
Run Code Online (Sandbox Code Playgroud)
然后我有各种内存问题,有时事情不能正常工作(你可以通过改变我在Sprite Demo的main.cpp中初始化所有Sprite对象的方式来看到这一点).
这是正常的吗?或者行为应该是一样的吗?
编辑 setter主要是为了让我的生活更容易初始化.我的主要问题是方法1和方法2对我来说有什么不同?
编辑: 这是一个getter和setter示例:
Sprite* Sprite::setSpeed(int i) {
speed = i;
return …
Run Code Online (Sandbox Code Playgroud) 我正在写一个游戏,我有一个输入类,其中包含所有不同键的布尔值.我在主游戏类中创建了这个类的实例.布尔是公开的,还是我应该使用访问者访问它们?
如果我们谈论域对象,为什么setter在接口上是坏的?
澄清:
我有一个存储在db中的域对象.它有几个领域,设置成本很高.即
class JurasicPark {
private long area;
...other fields ...
getters and setters
....
private Collection<Dinosaur> dinosaurs;
private Collection<ExoticTree> flora;
public Collection<Dinosaur> getDinosaurus(){
...
}
public Collection<ExoticTree> getFlora(){
...
}
}
Run Code Online (Sandbox Code Playgroud)
字段dinosaurs
并且flora
初始化和设置成本非常高.但在许多情况下,我不需要每次都设置这个字段.
问题是,如果我返回到JurasicPark类的用户实例,dinosaurs
或者flora
没有初始化它,那么填充导致NPE或我自己投掷的一些预期.我不想让api用户考虑这个并记住哪些字段可能没有设置.
因此,为了解决这个问题,我考虑创建两个接口IJurasicPark
,IFullJurasicPark
第一个将所有访问方法声明为简单字段,前者将声明访问方法flora
和dinosaurs
字段.
interface IFullJurasicPark extends IJurasicPark
class IJurasicPark implements IFullJurasicPark
Run Code Online (Sandbox Code Playgroud)
在这种方法中IJurasicPark接口将包含getter和setter,所以我实际上问这个设计是不是很糟糕?
我也不想在使用LazyInit异常的hibernate风格中实现它.
我最近开始制作简单的2D游戏,并遇到了两难 - 使用或不使用getter和setter方法来处理对象的x和y位置.如果我不使用方法,但是直接访问变量会更加清晰,而且对对象的许多方法调用会损害性能.此外,获取和设置位置仍然很简单,所以这里真的不需要封装吗?或者我们是否应始终坚持使用getter和setter方法的约定?
java ×4
oop ×3
c++ ×2
getter ×2
setter ×2
abstraction ×1
accessor ×1
class-design ×1
coding-style ×1
input ×1
interface ×1
pointers ×1
variables ×1