2013-02-12 2 views
2

Я новичок в Java ... Мой вопросJava: когда мы должны использовать методы инкубационных

Чтобы не получить доступ к членам данных за пределами класса мы используем модификатор доступа, и поэтому мы используем сеттер методы для их изменения вне класса. Ex: -

public class Test 
{ 

     private int a=10; 
     private int b=20; 
     public void sum(int x, int y) 
     { 
      System.out.println("Sum is:"+(x+y)); 
     } 
     public void setA(int a) 
     { 
      this.a=a; 
     } 
     public void setB(int b) 
     { 
      this.b=b; 
     } 
} 

Как такого типа случаев, почему бы нам не использовать открытые члены, а не изменять их с помощью инкубационных методов? И в каких ситуациях мы должны использовать сеттеры ...?

Я не могу понять that..Somebody, пожалуйста, помогите мне

Благодаря

+1

Странно, что ОП просит «Когда», но ответы на все «Почему». –

+0

@AlvinWong, я думаю, что ответ «почему» косвенно отвечает «когда» ... когда вам нужно изменить поле объекта, используйте установщик. – mre

+2

[Этот вопрос] (http://stackoverflow.com/questions/1568091/why-use-getters-and-setters) содержит длинную дискуссию по этой теме. – Henrik

ответ

4

Это называется инкапсуляцией. Методы мутаторов гарантируют, что поля будут изменены в ожидаемом и контролируемом способе.

3

Потому что ваши требования могут измениться.

public void setA(int a) 
{ 
    if (a >= 0) { 
     this.a=a; 
    } 
} 

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

+0

В реальном мире вы делаете это, и вы ломаете больше кода, чем вы исправляете, до такой степени, что каждый смотрит в изумлении, что вы думаете. Это нарушает принцип наименьшего удивления. Несомненно, может быть только один случай, когда вы можете с ним справиться, но это не может оправдывать написание всех этих тысяч и тысяч геттеров и сеттеров. –

+0

@MarkoTopolnik В реальном мире требования меняются. Если вы беспокоитесь о PLA, осудите метод setA и укажите другой, назначенный соответствующим образом setter. Если вы предпочитаете дублировать код в тысячах мест, будьте моим гостем. –

+0

Я просто говорю из практического опыта --- такое требование никогда, никогда, не приходило. Однако, если это когда-либо было, я бы ** предложил ** ввести отдельный метод проверки и изменить все места, где он был вызван. В чистом эффекте у меня было бы гораздо меньше кода. На практике проверка валидности - отдельная забота, которую по отдельному механизму позаботится, а не разбрызгивается в сеттерах. Setters ** set **, это их проблема, и хорошая архитектура сохраняет это. –

0

Преимущество Encapsulation:

  1. Поле класса может быть сделано только для чтения или только для записи.
  2. Класс может иметь полный контроль над тем, что хранится в его полях.
  3. Пользователи класса не знают, как класс хранит свои данные. Класс может изменять тип данных поля, а пользователям класса не нужно изменять какой-либо из их кодов.

Простой случай использования:

Вы хотели сохранить минимум a только:

private int a; 

public void setA(int a) { 
    if(this.a > a) 
     this.a = a; 
} 

Тогда вы передумали и хотел сохранить максимум a:

public void setA(int a) { 
    if(this.a < a) 
     this.a = a; 
} 

Если вы не использовали setA() me thod, то вам нужно было обновить каждое место, в котором вы пытались установить новое значение, a. Но если вы использовали setA(), вам не нужно прикасаться к другому месту, кроме метода setter.

Пожалуйста, обратите внимание на подобные вопросы:

What are the uses of getter/setters in Java?

+0

, пожалуйста, сообщите, верно ли мое понимание о тех моментах, которые вы упомянули. – user2064884

+0

, пожалуйста, сообщите, верно ли мое понимание о тех моментах, которые вы упомянули. 1) если мы написали только методы setter без геттеров, тогда он становится только для записи, если мы пишем только геттеры без сеттеров, тогда он становится только для чтения. 2) Потому что мы можем контролировать доступ через методы. мы имеем контроль над полями класса. 3) Я не понял об изменении этого типа данных полей. Как мы можем измениться? если мы изменим, как это не влияет на другие классы, которые используют эти данные? – user2064884

+0

Вы правы примерно 1 и 2. В 3 я хотел рассказать о примере, который я даю. – ogzd

0

Согласно ООП, вы всегда должны использовать личные атрибуты для инкапсуляции информации и убедитесь в том, что другой программист или объект будет влиять на какую-либо функциональность методы из-за плохую манипуляция переменного, например:

private int a=10; 
    private int b=20; 
    public void div() 
      { 
        System.out.println("Div is:"+(a/b)); 
      } 
     public void setA(int a) 
      { 
         this.a=a; 
      } 
    public void setB(int b) 
      { 
        if(b!=0) 
        this.b=b; 
      } 

к примеру, в этом случае инкубационные Подтверждает (я должен бросить ошибку или что-то), что нет 0 не будет сохранен в качестве атрибута, потому что я f это произойдет, это повредит метод div.

Так басистно, что вы используете сеттеры, когда вам нужно защитить данные по атрибутам, или вы хотите удостовериться, что любое значение, сохраненное в атрибутах, не повлияет на функциональность/методы внутри объекта.

p.d: Извините за мой английский.

+0

Спасибо, очень .. Я понял. Хорошее объяснение – user2064884

0

В группе classical biology experiment группа обезьян испытывает соблазн захватить банан, в результате чего для всех будет холодный душ. Они скоро перестают пытаться. Постепенно обезьяны заменяются новичками, и каждый новобранец учится нелегко трогать банан: получая раунд ударов и укусов ветеранов. Вскоре не осталось оригинального участника; никто не присутствовал, фактически был свидетелем холодного душа, и на самом деле механизм уже давно отключен. Тем не менее, новичков по-прежнему избивают за попытку съесть бананы.

В нашей истории бананы - это публичные поля, а обезьяны вокруг вас. Некритичное избегание общественных полей - не лучшая практика; это религиозная практика. Существует стандартная угроза «аргументов» для ее поддержки, но ни одна из них не носит универсального характера. Для того, чтобы назвать несколько:

  1. «требования могут измениться» — требования к сеттер чистого объекта данных никогда не меняется; это один из самых чистых примеров стабильного API. В настройках бизнес-логики геттеры/сеттеры на модели домена никогда не должны делать ничего, кроме чистого получения/настройки, потому что они используются во многих разных контекстах, включая тестирование, и не должно быть никаких неожиданностей. Все проблемы, кроме сохранения заданного значения, обрабатываются вне кода getter/setter;

  2. «внутреннее представление может измениться» — лучший способ для хранения int находится в int, String в String, и так далее. Никогда не возникает реальной ситуации, когда это было бы неверно;

  3. «общественных полей нарушает инкапсуляцию, на постамент ООП» — с общественными и сеттеры геттеры не существует никакого эффективного инкапсуляция, это формальность, не в реальной жизни эффект;

  4. «общественные поля препятствуют инструментирование/консультирование по рамочным кода» — просто посмотрите на Hibernate: она позволяет открытые поля на равных с геттеры/сеттеры. Решена проблема в современной Java.

Вы можете использовать прямой доступ к полям в каждом случае, когда рассматриваемый класс используется только локально и не отображается как открытый API. Кроме того, если класс представляет чистые данные, во многих случаях нормально использовать общедоступные поля даже в публичном API. Например, см. GridBagConstraints в стандартной библиотеке Java.

+0

Множество открытых классов 'java.awt' (Point, Dimension) открытых внутренних состояний. Это, как правило, считается недостатком дизайна, и его следует избегать, а не эмулировать. –

+0

@BilltheLizard. По-видимому, дизайнеры SWT не согласны с этим чувством --- они * эмулируют *. –

+0

@BilltheLizard Я искал googled вокруг и нигде не нашел поддержки для вашего «общепринятого» --- все, что я нахожу, является сильным аргументом с обеих сторон. Например, [см. Здесь] (http://stackoverflow.com/questions/1568091/why-use-getters-and-setters). –

0

Атрибуты класса (a и b в вашем случае) описывает состояние вашего объекта. Поэтому его хорошая практика в ООП состоит в том, чтобы сделать состоянием как частным и доступ к ним только с помощью общедоступных методов.

Вы можете получить доступ к приватным атрибутам только в том случае, если есть общедоступный сеттер/получатель. Таким образом, это дает вам гибкость, а также опцион ограничивает доступ (при необходимости).

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