2015-02-05 3 views
3
  • Зачем нам нужно использовать набор и методы get в нашем классе, которые используют частные атрибуты?
  • Когда он действительно используется в процессе нашей программы?
  • Можем ли мы по-прежнему работать без него (без изменения частных атрибутов для общественности)?

Это пример исходного кода, когда мы используем набор и получить методы:getters() и seters() упрощение для класса

public class Dog { 

    private String dogName; 
    private int dogAge; 

    public Dog(String dogName, int dogAge) { 
     this.dogName = dogName; 
     this.dogAge = dogAge; 
    } 

    public String getDogName() { 
     return dogName; 
    } 

    public void setDogName(String dogName) { 
     this.dogName = dogName; 
    } 

    public int getDogAge() { 
     return dogAge; 
    } 

    public void setDogAge(int dogAge) { 
     this.dogAge = dogAge; 
    } 

    @Override 
    public String toString() { 
     return "Dog{" + "dogName=" + dogName + ", dogAge=" + dogAge + '}'; 
    } 

} 
+1

Это хороший способ дизайна. Читайте об [encapsulation] (http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29) – TheLostMind

+1

Вы можете взглянуть на [Ломбок] (http://projectlombok.org/), если вы не " я хочу написать все ваши геттеры/сеттеры вручную. –

+0

Или просто переключитесь на C# и напишите ваши геттеры/сеттеры как автоматические свойства 'public string DogName {get; задавать; } ';) –

ответ

2

Если вы не видите точку инкапсуляции, позвольте мне продемонстрировать пример «реальной жизни» (который.

private boolean amIDrunk = true; 

public boolean getAmIDrunk(Object asker){ 
    if (asker instanceof PoliceOfficer){ 
     return false; 
    } else if (asker instanceof DrinkingBuddy){ 
     return true; 
    } 
    return amIDrunk; 
} 

public void setAmIDrunk(boolean setter){ 
    if (hadLessThen10Beers()) { 
     this.amIDrunk = false; 
     return; 
    } 
    this.amIDrunk = setter; 
} 

Конечно, это «ничтожество» пример, но это просто, чтобы показать, что иногда, просто потому, что вы называете сеттер, может быть причиной, чтобы не установить это значение, а иногда, когда геттер может возникнуть причина, вы не хотите возвращать фактическое значение.

В любом случае, чтобы продолжить в этом примере: имея amIDrunk как частную переменную, убедитесь, что кто-то еще не объявляет вас «пьяным», установив amIDrunk в true, без реализации вашего собственного метода набора, чтобы согласиться с ним ,

+0

Мне это нравится. Простой и разумный. Это именно то, что я искал. Потому что я уже знал обо всех причудливых словах, таких как (инкапсуляция, реализация, Accessors и Mutators ... и т. Д.), Но я не понял реальную концепцию использования методов set и get. Все, что я действительно хотел, это знать, когда это пригодится, независимо от их определения. Спасибо – askd

+0

@askd, хорошо знать определения, а стоит знать эти «причудливые» слова. – Maroun

+0

@askd Это действительно ответ на этот вопрос. В ООП инкапсулирование полей объекта с помощью методов getter и setter должно быть вашим выбором по умолчанию. Даже если вы не видите необходимости делать что-либо, кроме 'this.field = value' в сеттере при первом внедрении объекта, возможно, вам придется изменить это поведение в будущем. Кроме того, по существу невозможно высмеять объект, о котором идет речь, для модульного тестирования. –

0

сеттеров и добытчиками используются для достижения Encapsulation.

Да, мы можем заставить его работать без сеттеров и геттеров.

7

Почему мы должны использовать набор и методы get в нашем классе , которые используют частные атрибуты?

Если вы хотите, чтобы скрыть детали реализации (encapsulation - a fundamental principle of object-oriented programming), вы не хотите, чтобы кто снаружи к ним доступ, вы только поставить метод, который возвращает некоторое значение, но вы не хотите, чтобы показать реализацию.

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

Когда он действительно используется в процессе нашей программы?

Очень сложно ответить на этот вопрос, это действительно зависит от программы. Вы используете сеттеры и геттеры, если вы хотите .. получить или установить значение.

Можем ли мы по-прежнему работать без него?

Конечно, это работает, когда у вас есть public поля вместо private с, в смысле дизайна, рекомендуется начать с private переменных всегда, и изменить их только тогда, когда вы сусло.

+0

Не можете изменить ваш ответ, чтобы уточнить причину. Измените его, указав пример каждого заявления (ответа), сделанного из моего исходного кода. Например, что вы подразумеваете под «реализацией»? это частные атрибуты (dogName, dogAge) или что именно?другими словами, используйте мой исходный код, чтобы упростить то, что вы только что сказали. Спасибо – askd

+0

@askd В вашем примере программисты никогда не могут знать (если они ничего не знают об отражении), что вы используете два члена класса ('dogAge' и' dogName'), это не критично в вашем примере, но подумайте о чувствительных объектах , например, «BankAccount» .. вы не хотите, чтобы кто-либо знал, как вы храните переменные, как вы их изменяете, вы просто хотите дать им черный ящик, * вы * контролируете логику. – Maroun

+0

У меня есть еще один вопрос, если можно. Можем ли мы получить доступ к «частным» переменным непосредственно из одного класса. Я имею в виду, не используя методы для этого. Если да, то как? Надеюсь, вы сможете привести примеры. – askd

2

Мне лично не нравятся сеттеры и геттеры и заменяют их публичными полями, если можно. Тем не менее, есть ТЕХНИЧЕСКИЕ причины, чтобы держать их:

  • Mocking: Дразнящий каркасы, такие как Mockito или EasyMock не может Mock или переопределить прямое поле доступов
  • Доверенные: По разным причинам, прокси используются (Скопин в рамках DI, каротаж и т. д.). Опять же, не работает с полями
  • Основанные на JavaBeans фреймворки: некоторые рамки для сериализации XML не поддерживают доступ к полям.

Таким образом, во многих случаях использование геттеров/сеттеров просто упрощает вашу жизнь.Однако, если вы отвечаете за весь код в зависимости от ваших классов, просто используйте Refactor-> Encapsulate Field в eclipse (совершенно уверенная аналогичная функциональность существует во всех основных IDE), как только вы столкнетесь с проблемами.

0
  • Зачем нам нужно использовать набор и методы в нашем классе, которые используют частные атрибуты?

В Getters() и Setters() методов называется также Accessors and Mutators используются таким образом, мы можем Acces частных полей в классе из-за пределы.

public class myClass(){ 
    public void newDog(){ 
    Dog d=new Dog("Foxy", 2); 
    d.setDogAge(d.getDogAge()+1);//get the age of the dog and increment it 
    } 
} 
  • Когда он действительно используется во время нашего процесса программы?

Они используются, когда необходимо достичь чтения (with getters)/записи (with setters) операции с нашими частными полями (, как и в предыдущем примере).

  • Можем ли мы по-прежнему работать без него?

Да, конечно, мы можем, если объявить эти поля как общественный (случай по умолчанию):

String dogName; 
int dogAge; 

а также prvious пример будет:

public class myClass(){ 
    public void newDog(){ 
    Dog d=new Dog("Foxy", 2); 
    d.dogAge=d.dogAge+1;//get the age of the dog and increment it without getters and setters 
    } 
} 

Посмотрите на TutorialsPoint's Encapsulation Tutorial для дополнительной информации.

0

Зачем нам нужно использовать набор и методы в нашем классе, которые используют частные атрибуты?

Этот термин «инкапсуляция» относится к объектно-ориентированному программированию. Инкапсуляция заключается в том, что вы скрываете реализацию, но предоставляете доступ.

Когда он действительно используется в процессе нашей программы?

Getters есть, чтобы получить некоторое значение, когда сеттеры должны установить значение. В вашем коде вы установили Dogs name как String и age как int. Наконец, у вас есть получатели, чтобы получить заданное значение.

Можем ли мы по-прежнему работать без него?

Да. Вы можете заставить его работать, изменив объявленные переменные private. Фактически ключевое слово private сделает эту переменную видимой только для класса, где она объявлена.

Это дает вам подробное объяснение об объектах. http://docs.oracle.com/javase/tutorial/java/concepts/object.html

0

Я рекомендую прочитать о Котлин kotlinlang.org

Вы можете написать геттеры/сеттеры для POJO в 1 линии: например

data class Customer(val name: String, val email: String, val company: String) 
0

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

Вы всегда можете позволить своей IDE (Eclipse, IntelliJ, Netbeans) написать для вас геттеры и сеттеры. Но если вы хотите, чтобы ваш код был сухим и легким для чтения, вы также можете рассмотреть возможность использования Lombok, что автоматически сделает геттеры и сеттеры.

1

Другая причина использования «методов доступа» (сеттеров и геттеров) заключается в том, что это соглашение используется в IoC (инверсия управления). Таким образом, такие рамки, как Spring и т. Д. Может показаться утомительным для их создания, но если вы используете eclipse в качестве среды IDE, например, вы можете автоматически создавать сеттеры и геттеры (source | generate getters and setters).

Далее важны ваши личные переменные-члены. Допустим, у вас есть:

public String telephoneNumber; 

Что остановить кто-то это делает:

object.telephoneNumber = "not a telephone number". 

Если вы использовали сеттер вы могли бы сделать это:

public void setTelephoneNumber(final String telephoneNumber) { 
    if (telephoneNumber==null||telephoneNumber.length()==0) { 
     throw new IllegalArgumentException("you cannot supply null telephone numbers"); 
    } 
    ... etc. 
    this.telephoneNumber = telephoneNumber; 
} 

Таким образом, ваш telephoneNumber переменная-член будет только когда-либо иметь действительный номер телефона. Теперь ваш класс полностью изолирован (инкапсулирован), потому что вы не полагаетесь на внешние классы, чтобы относиться к своим переменным-членам с уважением.

+0

Это также хороший пример. Это отвечает на мой вопрос. спасибо – askd

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