以下是两种方法:
优点:我必须输入确切数量的参数类型,所以如果我发出错误,编译器会警告我(顺便说一下,有没有办法防止错误地在参数列表上切换两个Integer的问题?)
缺点:如果我有很多属性,那么实例化行可以变得非常长并且可以跨越两行或更多行
优点:我可以清楚地看到我正在设置的内容,所以如果我做错了什么我可以在输入时立即查明它(我不能在切换两个相同类型的变量时出现前一个错误)
缺点:具有大量属性的对象的实例化可能需要多行(不知道这是否真的是一个con),如果我忘记设置属性,编译器就不会说任何内容.
你会做什么以及为什么?你知道任何光模式(考虑到应该在每次实例化7个以上的属性时使用它)吗?我问这个是因为我倾向于不喜欢大型构造函数,我无法快速找出我正在寻找的变量的位置,另一方面我发现"set all properties"容易遗漏一些属性.
请随意在优缺点中论证我的假设,因为它们只是我的想法:)
更新 - 我发现的一个与此相关的问题:构建大的不可变对象,而不使用具有长参数列表的构造函数
我不知道为什么使用__setattr__简单的引用之类的x.a=1.
我理解这个例子:
class Rectangle:
def __init__(self):
self.width = 0
self.height = 0
x=Rectangle()
x.width=20
x.__setattr__('height',30)
setattr(x,'width',99)
Run Code Online (Sandbox Code Playgroud)
但不明白为什么使用代码取决于字符串('高度').
你能解释一下我有什么好处__setattr__吗?
我对使用getter/setter和构造函数感到有点困惑(参见下面的代码示例)
public class ExampleClass {
private int value = 0;
public ExampleClass () {
value = 0;
}
public ExampleClass (int i) {
this.value = i;
}
public int getValue() {
return value;
}
public void setValue(int val) {
this.value = val;
}
public static void main(String[] args) {
ExampleClass example = new ExampleClass (20);
example.setValue(20);
//Both lines above do same thing - why use constructor?
System.out.println(example.getvalue());
}
}
Run Code Online (Sandbox Code Playgroud)
我所学到的只是我们需要getter/setter来保证安全性,以及以后它们也可以用来更改或编辑值.
我的问题是,如果构造函数是初始化点并且始终存在默认构造函数,为什么使用带参数的构造函数来初始化值而不是getters/setter?.不会使用getter和setter提供安全性,并且能够在任何阶段轻松更改值.请为我澄清这一点.
我是Java新手,但对ActionScript 3有一些OOP经验,所以我试图依靠我所知道的东西进行迁移.
在ActionScript 3中,您可以使用get和set关键字创建getter和setter,这意味着您在类中创建方法并通过该类的实例的属性访问数据.我可能听起来很复杂,但事实并非如此.这是一个例子:
class Dummy{
private var _name:String;
public function Dummy(name:String=null){
this._name = name;
}
//getter
public function get name():String{
return _name;
}
//setter
public function set name(value:String):void{
//do some validation if necessary
_name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我会name在一个对象中访问:
var dummy:Dummy = new Dummy("fred");
trace(dummy.name);//prints: fred
dummy.name = "lolo";//setter
trace(dummy.name);//getter
Run Code Online (Sandbox Code Playgroud)
我怎么用Java做到这一点?
只是拥有一些公共领域是不可能的.我注意到有一种在方法前面使用get和set的约定,我很好.
例如,
class Dummy{
String _name;
public void Dummy(){}
public void Dummy(String name){
_name = name;
}
public String getName(){
return _name;
}
public void setName(String …Run Code Online (Sandbox Code Playgroud) 我正在将一个项目转换为Swift代码,并在setter中遇到了一个问题.我的Objective-C代码看起来像这样:
- (void)setDocument:(MyDocument *)document
{
if (![_document isEqual:document]) {
_document = document;
[self useDocument];
}
}
Run Code Online (Sandbox Code Playgroud)
并允许我的View Controller在每次设置文档时运行它(通常在prepareForSegue:呈现View Controller 的方法中).
我找到了属性观察者willSet,didSet但它们只在更新属性时才起作用,而不是在初始化和更新时.
有任何想法吗?谢谢
UPDATE
尝试get {}并设置{}后,我收到EXC_BAD_ACCESS错误
var document: UIDocument? {
get {
return self.document!
}
set {
self.document = newValue
useDocument()
}
}
Run Code Online (Sandbox Code Playgroud) 在某些情况下,比如MVVM视图模型,我有时需要私有setter,因为视图模型公开了一个只能在内部修改的状态.
那么在接口上需要私有的setter是错误的吗?(我的意思不是特别在所描述的场景中)如果没有,为什么C#编译器不允许它?
谢谢.
无论出于何种原因,自定义对象的Javascript getters/setter似乎适用于任何浏览器,但IE.
IE是否有任何其他非标准机制?(与许多其他功能一样)
如果没有,是否有任何变通方法可以实现相同的功能?
我想创建一个类的对象,然后使用setter方法设置其中的所有属性.有超过150个setter方法,我确实想要输入每个方法,甚至Object instance在dot中键入对象实例名称类型.,然后点击Eclipse的空格键给我建议,然后选择setter方法.我不想这样做150次.
因此,我在Eclipse中寻找某种快捷方式,允许您调用方法上的所有setter.就像你输入实例名称一样,Eclipse会调用所有的setter方法,例如
我不能在类中创建另一个构造函数,我不允许这样做
我最近对Getters and Setters遇到了很多不同的看法,所以我想我应该把它变成自己的问题.
一个先前的问题我的收到的规定制定者不应该有任何的副作用立即发表评论(后来被删除),和SetProperty方法将是一个更好的选择.
实际上,这似乎也是微软的意见.但是,它们的属性通常会引发事件,例如设置Resized表单Width或Height属性时.OwenP还指出"你不应该让一个房产抛出异常,房产不应该有副作用,顺序应该无关紧要,房产应该相对快速地返回."
然而,Michael Stum声明在验证setter中的数据时应该抛出异常.如果你的setter没有抛出异常,你怎么能有效地验证数据,因为这个问题的许多答案都表明了这一点?
什么时候你需要举办一个活动,比如几乎所有的微软控制公司呢?那么你是不是受到任何订阅你的活动的怜悯?如果他们的处理程序执行大量信息,或者自己抛出错误,那么你的setter会发生什么?
最后,getter中的延迟加载怎么样?这也可能违反以前的准则.
放置在getter或setter中可以接受什么,以及只有accessor方法应该保留什么?
编辑:
来自MSDN中的另一篇文章:
这些
get和set方法通常与其他方法没有区别.它们可以执行任何程序逻辑,抛出异常,被覆盖,并使用编程语言允许的任何修饰符进行声明.但请注意,属性也可以是静态的.如果属性是静态的,那么get和set方法可以做什么有限制.有关详细信息,请参阅编程语言参考
我对Objective-C很有经验,在Objective-C中你可以让编译器为你生成getter和setter(如果它们还没有存在@synthesize).
有没有办法在C++中执行此操作,还是我需要自己实现所有getter和setter?
setter ×10
getter ×5
java ×4
accessor ×2
constructor ×2
properties ×2
c# ×1
c++ ×1
class ×1
eclipse ×1
interface ×1
javascript ×1
oop ×1
python ×1
swift ×1