2012-02-09 3 views
6

Я могу назвать переменные двумя способами.Правильный способ получения переменной из другого класса

Один раз сделать это следующим образом:

MyClass myClass = new MyClass();  

myLocalVar = myClass.myVarVal; 

А другой способ заключается в использовании поглотитель, как это:

myLocalVar = myClass.getMyVarVal(); 

Оба способа работают отлично, но мне было интересно, что был бы самым эффективным/правильным способом сделать это?

Благодаря

+3

Много ресурсов [здесь] (http://stackoverflow.com/q/1568091/387852), [здесь] (http://stackoverflow.com/q/565095/387852) и [здесь] (http : //stackoverflow.com/q/996179/387852). –

+0

Но что, если у меня есть 50 переменных, которые описывают объект. Например, скажем, у меня есть объект под названием «Автомобиль», а затем у меня есть куча переменных, таких как carType, carColor, carHP, carMaker, carName, carWheelBase, carMPG, carTransmission, carEngine и т. Д. ... мне нужно сделать getter и сеттер для каждого из них? Это похоже на TON дополнительного кодирования .... – SkyeBoniwell

+2

Современные IDE (например, Eclipse) могут делать это автоматически. Но вы также должны спросить себя, нужно ли вам подвергать эти переменные внешнему миру. Вы нарушаете хорошие принципы инкапсуляции? –

ответ

11

Оба методы страшна, но с использованием сорбента является общей (и безопаснее) практикой.

Чтобы получить доступ к общедоступному элементу данных (общедоступное или общедоступное свойство a.k.a.) класса, вы должны знать сведения о реализации этого класса (имя члена данных и тип элемента данных). Это плохо. он нарушает концепцию ООП «скрытие информации» и увеличивает «сцепление».

Использование геттера также плохо (как в плохой практике ООП), потому что объекты не просто обертывают данные; объекты должны инкапсулировать функциональность и данные. «Сохраните это значение здесь, чтобы я мог его получить позже» - это не функциональность; это функция hoot (как у обезьяны в hage hack). Геттеры; однако, принятая практика в java (и другие языки OOP-lite, такие как C++ и C#).

Чтобы вы не считали, что я - немного башня из слоновой кости, я, конечно, использую геттеры; Я использую java, поэтому я использую getters.

Getters отлично подходит для выполнения работы (без каламбуров), просто не ходите вокруг, полагая, что «IR gud OOP Prgmr», потому что, если вы используете геттеры, вы не являетесь «хорошим программистом», вы просто программист, который выполняет работу.

Редактировать: Возможно, лучший способ.

Лучше всего не использовать геттеры, а вместо этого создавать классы, чтобы они отображали функциональность, а не данные. На практике есть момент, когда это ломается; например, если вам нужно отобразить адрес на странице JSP, вы поместите бит в запрос (или сеанс или бла) с адресом и выставляете значения с помощью геттеров. «Более чистый чистый» способ заключается в том, чтобы поместить компонент, который выставил «отображение адреса на jsp».

Edit2: Возможно, лучший пример.

Скажем, я работаю в телефонной компании в США, и у меня есть объект, который представляет собой номер телефона для клиентов. Это может выглядеть следующим образом:

public class CustomerPhoneNumber 
{ 
    private String npa; // numbering plan area (google search nanp for more details) 
    private String nxx; // exchange. 
    private String serviceNumber; 

    public String toString() 
    { 
    return "(" + npa + ") " + nxx + "-" + serviceNumber; 
    } 

    public boolean equals(Object object) 
    { 
    ... standard equals implementation (assume this works) 
    } 
} 

Теперь предположим, что я получаю номер телефона в качестве входных данных с веб-страницы в виде String inputPhoneNumber. В целях обсуждения класс, который получает этот вход, называется «сервлет».

Как я могу ответить на этот вопрос: «Является ли номер входного телефона в моем списке объектов CustomerPhoneNumber?»

Вариант 1 делает публичные члены данных npa, nxx и serviceNumber общедоступными и доступ к ним. Это ужасно.

Вариант 2 предоставляет геттеры для npa, nxx и служебного номера и сравнивает их с входом. Также ужасно, слишком много внутренних деталей разоблачено.

Вариант 3 представляет собой приемник, который возвращает форматированный номер телефона (я назвал это toString() выше). Это умнее, но все еще ужасно, потому что сервлет должен знать формат, который будет использоваться геттером, и убедитесь, что вход форматируется одинаково.

Вариант 4 (я называю это «Добро пожаловать в ООП») предоставляет метод, который принимает строку и возвращает true, если это соответствует номеру службы клиента. Это лучше и может выглядеть следующим образом (название длинное, но достаточно для данного примера):

public boolean doesPhoneNumberMatchThisInput(final String input) 
{ 
    String formattedInput; 
    String formattedCustomerPhoneNumber = npa + nxx + serviceNumber; 

    formattedInput = ... strip all non-digits from input. 

    return StringUtils.equals(formattedCustomerPhoneNumber, formattedInput); 
} 

Это победитель, потому что никаких деталей реализации не подвергается. Также toString может использоваться для вывода номера телефона на странице JSP.

StringUtils является частью Apache Commons Lang.

+0

так есть лучший способ или геттеры - просто необходимое зло? – SkyeBoniwell

+0

Здесь есть [отличная статья] (http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html) для тех, кто ищет более подробное объяснение (см. * A Ball and A Dog * для очень понятной аналогии.) –

8

Ради encapsulation вы всегда должны идти со второй альтернативой.

myLocalVar = myClass.getMyVarVal(); 

Эффективность мудрого вы, скорее всего, не заметите разницы.

4

ВСЕГДА используйте геттер и сеттер для доступа к вашим свойствам!

Вы также должны посмотреть на this.

1

myClass.getMyVarVal() более медленный, так как это вызов метода, и поэтому он создает вход в стек для возвращаемого значения и т. Д. Но лучше использовать ООП для использования геттеров.

+2

Язык Java не требует, чтобы вызов метода был реализован таким образом. На самом деле, скорее всего, такой метод будет включен. – aioobe

1
myLocalVar = myClass.getMyVarVal(); 

будет хорошо использовать, если вы работаете с OOP концепцией

2

Просто создайте объект и object.variablename; или object.methodName(); можно использовать для создания нестатического задания ... использование геттера не требуется.

Смежные вопросы