Я правильно делаю геттеры / сеттеры в Java? - PullRequest
1 голос
/ 12 мая 2010
public class Persona {
    int Codigo;
    String Nombre;

    public Persona(int Codigo, String Nombre){
        this.Codigo = Codigo;
        this.Nombre = Nombre;
    }

    public void setCodigo(int Codigo){
        this.Codigo = Codigo;
    }

    public int getCodigo(){
        return this.Codigo;
    }

    public void setNombre(String Nombre){
        this.Nombre = Nombre;
    }

    public String getNombre(){
        return this.Nombre;
    }


}

Или есть более короткий (реальный) способ сделать это?

Ответы [ 10 ]

11 голосов
/ 12 мая 2010

Это зависит от того, что вы подразумеваете под «сделай это». Геттеры и сеттеры лучше общедоступных полей, но нужны ли они вам вообще?

  • Вам нужно вообще предоставлять эту информацию или просто работать с ней для выполнения других операций?
  • Если вам нужно выставить его, вам определенно нужно, чтобы ваш тип был изменяемым с сеттерами? Неизменяемые типы, как правило, легче рассуждать, обрабатывать потоки и т. Д.

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

public final class Persona {
    private int codigo;
    private String nombre;

    public Persona(int codigo, String nombre) {
        this.codigo = codigo;
        this.nombre = nombre;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getNombre() {
        return nombre;
    }
}

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

Наконец, я создал класс final - я верю в "дизайн для наследования или запрета" - если вам нужно получить от этого класса, подумайте, какого рода специализация, которую вы хотите поддержать.

1 голос
/ 12 мая 2010

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

1 голос
/ 12 мая 2010

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

class Persona {
    int Codigo
    String Nombre
}

Это было бы фактически то же самое

Как уже упоминали другие, если вам не нужны сеттеры, вы должны избегать их и сделать ваши переменные final. Неизменные объекты с меньшей вероятностью станут источником ошибок позже.

1 голос
/ 12 мая 2010

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

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

Выразительная (если немного экстремальная) статья по этому вопросу доступна здесь: Почему методы получения и установки злые .

0 голосов
/ 12 мая 2010

Как сказал Джон, у вас должна быть веская причина, чтобы нуждаться в геттере / сеттере. Рассмотрим неизменный класс как альтернативу вашему делу.

public final class Persona {
    private final int codigo;
    private final String nombre;

    public Persona(int codigo, String nombre) {
        this.codigo = codigo;
        this.nombre = nombre;
    }

    public int getCodigo() {
        return codigo;
    }

    public String getNombre() {
        return nombre;
    }
}
0 голосов
/ 12 мая 2010

Ваши переменные не private, они по умолчанию. Таким образом, они являются открытыми для классов в том же package. Вы, вероятно, хотите сделать их private. Кроме того, сеттер не всегда нужен, хотя getter почти всегда нужен.

0 голосов
/ 12 мая 2010

Поля должны быть приватными. Причина - Инкапсуляция . Вы хотите скрыть детали реализации от любых других Классов, которые используют ваш класс Persona. Возможно, вы когда-нибудь захотите установить минимальное и максимальное значения для codigo или убедиться, что оно имеет фиксированный набор значений, вы можете сделать это в методе setCodigo(), не обращая на это внимания клиентского кода. Только с открытыми полями вы не можете перехватить мутацию поля и повлиять на нее.

public final class Persona 
{
    private int codigo;
    private String nombre;

    public Persona(final int codigo, final String nombre)
    {
        this.codigo = codigo;
        this.nombre = nombre;
    }

    public void setCodigo(final int codigo)
    {
        this.codigo = codigo;
    }

    public int getCodigo()
    {
        return this.codigo;
    }

    public void setNombre(final String nombre)
    {
        this.nombre = nombre;
    }

    public String getNombre()
    {
        return this.nombre;
    }
}

и я исправил выравнивание ваших скобок для вас :-) Использование this. для всех переменных экземпляра везде является хорошей практикой кодирования. Явное лучше, чем неявное.

0 голосов
/ 12 мая 2010

Возможно, вы захотите сделать переменные-члены Nombre и Cordigo "приватными". Так как в этом весь смысл использования геттеров / сеттеров.

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

0 голосов
/ 12 мая 2010

Да, выглядит нормально. Хотя вы не должны использовать заглавные буквы в именах переменных.

0 голосов
/ 12 мая 2010

Это выглядит как хорошие сеттеры / геттеры для меня. Однако, если вы передадите оба значения в конструктор, вы уверены, что нужны оба метода установки / получения? В этом случае, похоже, будет достаточно только получателей. Кроме того, если вы решите придерживаться передачи Codigo и Nombre в конструктор и удалить классы-установщики, вы должны сделать их final, т.е. неизменяемыми.

Еще один момент - не использовать заглавные буквы Codigo, а Nombre, codigo и nombre - рекомендуемая форма. Случай верблюда для методов и полей, только заглавные буквы классов, интерфейсов и констант.

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