2009-12-22 3 views
4

Есть ли benifit к использованию:Преимущества геттера/сеттера VS public vars?

private var _someProp:String; 

public function set someProp(value:String):void 
{ 
    _someProp = value; 
} 
public function get someProp():String 
{ 
    return _someProp; 
} 

В отличие от просто с помощью:

public var someProp:String; 

Я понимаю, что с помощью геттер/сеттер может быть полезно, когда вам необходимо дальнейшей обработке или должны быть уведомлены когда свойство изменяется следующим образом:

public function set someProp(value:String):void 
{ 
    _someProp = value; 
    _somePropChanged = true; 
    doSomethingElse(); 
} 

Но если вам не нужно это, то нет никаких оснований использовать геттер/сеттер над только с помощью публичного вар?

Спасибо!

+1

Дубликат этого http: // stackoverflow.com/вопросы/1568091/why-use-getters-and-setters –

ответ

4

В зависимости от вашего языка вы должны предпочесть геттер/сеттер спереди, потому что вы не можете ввести их позже (я смотрю на вас, Java), если окажется, что они вам понадобятся.

+0

+1; Одна из моих многочисленных ненависти к Java! – silentcontributor

+2

Почему вы не можете изменить его позже на Java? –

+1

Поскольку у него нет понятия свойства: существуют переменные экземпляра и методы экземпляра. Итак, (при условии соглашений о бинах), чтобы получить доступ к свойству 'foo'", вы вызываете 'getFoo()' и устанавливаете свойство 'foo', которое вы вызываете' setFoo (myFoo) '. –

1

Это действительно зависит немного от языка/рамки/набор инструментов, который вы используете -

Однако часто возникают преимущества при использовании методов получения и установки, связанные с версиями и совместимости API. Это может быть очень полезной причиной для их использования, само по себе.

0

В качестве примечания вы можете начать с публичного var и при необходимости преобразовать его в getter/setter позже в коде .. в зависимости от языка, который вы используете.

+0

Обычно это прерывает двоичную совместимость, хоть. –

0

Если ваша собственность полностью тупая и не имеет побочных эффектов для остальной части класса, то обязательно используйте ее как публичное поле.

Его просто так, что во многих случаях у ваших свойств есть, есть побочные эффекты, поэтому вам нужно контролировать, как они установлены и доступны.

Как тривиальный пример, что произойдет, если ваша переменная public не настроена на что-то в вашем конструкторе? Вы в порядке, когда это возвращается как null? Или вы хотите установить эту переменную на что-то, а не на возврат null? Это простой пример, когда пользовательский getter стоит.

0

Getters and Setters также дают вам больше контроля над значениями, к которым может быть задана переменная.

bool setAge(int age){ 
    bol retVal = true; 

    if(age <= 0) 
     retVal = false; 

    return retVal; 
} 

Без установщика значение может быть установлено равным нулю, и могут произойти плохие вещи.

1

На это нельзя ответить без знания языка. Getters и Setters стоят дороже на большинстве языков, но они покупают вам гибкость по дороге. На некоторых языках вы не можете изменить публикацию в Getter/Setter, не изменяя код в вызывающих, потому что синтаксис использования изменяется. Но это не проблема с C#, которую я пишу в основном.

Getters and Setters позволяют выполнять проверку параметров. Они позволяют вам откладывать создание объектов до первой ссылки. У них есть много преимуществ, и я использую их, когда мне нужно одно из этих преимуществ с самого начала.

Но я использую геттеры и сеттеры ТОЛЬКО, когда они мне нужны, или когда я уверен, что мне понадобится гибкость. В противном случае я считаю их раздутыми.