1

我对魔法方法 getter 和 setter 有疑问。

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

PS 这是 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;
        }
   }

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

谢谢!

4

2 回答 2

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
于 2012-07-06T07:13:22.530 回答
2

我总是更喜欢在声明它们的同一类的方法中使用 getter 和 setter(尽管我可以使用 privare 变量)。

当您必须设置或获取类属性时,getter 和 setter 隐藏了所需的逻辑,因此您可以在 setter/getter 中修改“您实际执行的操作”,而不必担心对客户端方法的影响。

他们还避免重复代码。

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

于 2012-07-06T07:27:21.890 回答