使用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,还是应该坚持使用它们?
通过"生成",我的意思是自动生成特定选择的(一组)变量所需的代码.
但欢迎任何更明确的解释或对良好做法的评论.
我正在使用Ruby on Rails 3.2.2,我想知道以下是否是一个"正确"/"正确"/"确定"的方式来覆盖我的类属性的setter方法.
attr_accessible :attribute_name
def attribute_name=(value)
... # Some custom operation.
self[:attribute_name] = value
end
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎按预期工作.但是,我想知道,通过使用上面的代码,将来我会遇到问题,或者至少,我应该在Ruby on Rails上遇到"我应该期待"/"可能发生"的问题.如果这不是覆盖setter方法的正确方法,那么正确的方法是什么?
注意:如果我使用代码
attr_accessible :attribute_name
def attribute_name=(value)
... # Some custom operation.
self.attribute_name = value
end
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
SystemStackError (stack level too deep):
actionpack (3.2.2) lib/action_dispatch/middleware/reloader.rb:70
Run Code Online (Sandbox Code Playgroud) 我一直在努力让自己的头脑能够吸引人并且不会陷入其中.我已经阅读过JavaScript Getters and Setters和Defining Getters and Setters而且还没有得到它.
有人可以明确说明:
您使用什么约定来评论getter和setter?这是我一直想知道的事情,例如:
/**
* (1a) what do you put here?
* @param salary (1b) what do you put here?
*/
public void setSalary(float salary);
/*
* (2a) what do you put here?
* @return (2b)
*/
public float getSalary();
Run Code Online (Sandbox Code Playgroud)
我总是发现我为1a/b和2a/b编写完全相同的东西,例如1a)设置雇员的工资,1b)雇员的工资.这似乎是多余的.现在我可以看到更复杂的东西,你可以在(a)部分写更多内容,给出上下文,但对于大多数的getter/setter,那里的措辞几乎完全相同.
我只是好奇,如果对于简单的getter/setter,只需填写(a)部分或(b)部分即可.
你怎么看?
我来自php世界.你能解释一下getter和setter是什么,可以给你一些例子吗?
我对ECMAScript 6类中getter和setter的重点感到困惑.什么目的?以下是我所指的一个例子:
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
return this._name.toUpperCase();
}
set name(newName){
if(newName){
this._name = newName;
}
}
}
Run Code Online (Sandbox Code Playgroud) 通常我们使用
@interface interface_name : parent_class <delegates>
{
......
}
@end
Run Code Online (Sandbox Code Playgroud)
在.h文件和.m文件中的方法中,我们合成了在.h文件中声明的变量的属性.
但是在某些代码中,这个@interface ..... @ end方法也保存在.m文件中.这是什么意思?他们之间有什么区别?
还要提供一些关于.m文件中定义的接口文件的getter和setter的话.
提前致谢
可能重复:
为什么要使用getter和setter?
我已阅读的书Java
,说这是好事,创建getter和setter方法的变量,如x
和y
.例如:
public int getX(){
return x;
}
public void setX(int x){
this.x = x;
}
Run Code Online (Sandbox Code Playgroud)
但与此有什么不同
...(shape.x)... // basically getX()
Run Code Online (Sandbox Code Playgroud)
和
shape.x = 90; // basically setX()
Run Code Online (Sandbox Code Playgroud)
如果选手和吸气器更好,你能解释一下会出现什么样的实际问题吗?
setter ×10
getter ×9
java ×5
oop ×2
abstraction ×1
accessor ×1
c# ×1
class ×1
comments ×1
ecmascript-6 ×1
header-files ×1
interface ×1
javadoc ×1
javascript ×1
objective-c ×1
overriding ×1
ruby ×1