2012-07-06 59 views
1

我有一个关于魔术方法getter和setter的问题。更好地使用setter和getter

我的问题是:什么更好(更快,更安全)?

P.S.这是ActionScript 3,但这个问题可以为PHP,JavaScript,C#等其他语言解答。

情况1

public class Test extends Sprite 
    { 
     private var _test : uint = 0; 

     public function Test() 
     { 
      start(); 
     } 

     private function start() : void 
     { 
      trace(_test); ** Take the private var _test ** 
     } 

     public function set test(value : uint) : void 
     { 
      _test = value; 
      start(); 
     } 

     public function get test() : uint 
     { 
      return _test; 
     } 
    } 

或案例2

public class Test extends Sprite 
    { 
     private var _test : uint = 0; 

     public function Test() 
     { 
      start(); 
     } 

     private function start() : void 
     { 
      trace(test); ** difference here, take the public function test ** 
     } 

     public function set test(value : uint) : void 
     { 
      _test = value; 
      start(); 
     } 

     public function get test() : uint 
     { 
      return _test; 
     } 
    } 

什么是最好的(最快)的方法?

谢谢!

回答

2

I al方法更倾向于将getter和setter用于声明它们的同一类的方法中(尽管我可以使用私有变量)。

当您必须设置或获取类属性时,获取器和设置器会隐藏所需的逻辑,因此您可以在设置器/获取器内修改“实际做什么”,而不必担心客户端方法的影响。

他们还避免重复的代码。

但是,这只是我的观点... :)

+0

真的没有想过这件事。我将使用getter和setter,所以我没有重复的代码来操作属性。 – 2012-07-06 07:36:44

5

你的方式来编写自己的测试案例,找出自己约90%..

getter和setter方法的目的是在当一个属性设置或检索或创建个究竟添加控制只读或只写属性。

这些好处远远超过了任何可能的性能差异。


至于那些性能差异,这里是一个测试环境:

// Test property. 
var _test:uint = 0; 
function get test():uint{ return _test; } 
function set test(value:uint):void{ _test = value; } 

// Direct access test. 
function directTest(amt:int):Number 
{ 
    // Directly accessing the property. 
    var t:Number = getTimer(); 
    for(var i:int = 0; i < amt; i++) 
    { 
     var temp:uint = _test; 
     _test = i; 
    } 

    return getTimer() - t; 
} 


// Getter/setter test. 
function viaTest(amt:int):Number 
{ 
    // Via getter/setter. 
    var t:Number = getTimer(); 
    for(var i:int = 0; i < amt; i++) 
    { 
     var temp:uint = test; 
     test = i; 
    } 

    return getTimer() - t; 
} 

如何使用这一个快速演示:

trace("Direct: " + directTest(1000000)); 
trace("Getter/Setter: " + viaTest(1000000)); 

而且一些成果,我得到了:

Amount  Direct  Get/Set 
1000  0   0 
5000  0   0 
20,000  0   2 
150,000  1   14 
500,000  2   46 
2,000,000 10   184 
10,000,000 47   921 
+0

如果我设置并获得像每秒100次的属性呢? – 2012-07-06 07:15:34

+0

@Bondye,哇每秒100次?!小心在这里你可以烤你的CPU。 – 2012-07-06 07:29:56

+0

@Bondye我已经添加了一些实际的数据为您的观看乐趣。基本上,即使在访问属性1000万次时,对于这两种选择而言,您都会看到不到一秒的时间。 – Marty 2012-07-06 07:30:55