Инициализация приватных переменных внутри конструктора - PullRequest
2 голосов
/ 21 февраля 2011

Я искал этот код для сравнения.Мой вопрос, есть ли конкретное преимущество инициализации двух закрытых переменных внутри конструктора (сделано здесь в конструкторе по умолчанию).Я знаю, что второй конструктор может быть использован для создания экземпляра с предоставленными значениями.Какая разница, если я сделаю

private String sortBy = COLUMN_LAST_NAME;
private boolean ascending = true; 

Я прошу прощения, если это действительно простой и общий вопрос.

public class CustomComparator implements Comparator<StudentList>
{   private String sortBy;
private boolean ascending;

public CustomComparator()
{
    sortBy = COLUMN_LAST_NAME;
    ascending = true;
}

public CustomComparator(String sortBy, boolean ascending)
{
    this.sortBy = sortBy;
    this.ascending = ascending;
}

Ответы [ 4 ]

6 голосов
/ 22 февраля 2011

Лучшая практика, которую я видел проповедованной повсюду, - это иметь один конструктор, который принимает все параметры, даже если это означает, что он должен быть закрытым, а затем просто вызывать его из других конструкторов, используя this(..,..,...) при предоставлении соответствующих значений.

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

Ваш пример будет выглядеть следующим образом:

public class CustomComparator implements Comparator<StudentList> {
    private String sortBy;
    private boolean ascending;

    public CustomComparator()
    {
        this(COLUMN_LAST_NAME, true);
    }

    public CustomComparator(String sortBy, boolean ascending)
    {
        this.sortBy = sortBy;
        this.ascending = ascending;
    }
}

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

3 голосов
/ 22 февраля 2011

На самом деле это имеет значение, если вы заботитесь об неизменности объекта (и вам следует :-)).Если оба ваших поля final, вы должны инициализировать их следующим образом:

public class CustomComparator implements Comparator<StudentList> {
    private final String sortBy;
    private final boolean ascending;

    public CustomComparator() {
        sortBy = COLUMN_LAST_NAME;
        ascending = true;
    }

    public CustomComparator(String sortBy, boolean ascending) {
        this.sortBy = sortBy;
        this.ascending = ascending;
    }
}

Или даже лучше:

public class CustomComparator implements Comparator<StudentList> {
    private final String sortBy;
    private final boolean ascending;

    public CustomComparator() {
        this(COLUMN_LAST_NAME, true);
    }

    public CustomComparator(String sortBy, boolean ascending) {
        this.sortBy = sortBy;
        this.ascending = ascending;
    }
}
1 голос
/ 22 февраля 2011

это все, что вам нужно, оба конструктора - хороший выбор, безусловно, если вы хотите инициализировать поля, это лучший выбор, но подумайте, если вы используете этот класс как Entity в Hibernate или как bean-компонент в Spring Framework, если вы не пишите пустой конструктор, ничего не будет работать нормально ...

если вы думаете в шаблонах DTO, объявляя неизменяемые поля, такие как @Tomasz Нуркевич говорит, что параметризованный конструктор - единственный выбор ....

но, как я уже говорил, это зависит от требований ...

0 голосов
/ 22 февраля 2011

Я не могу думать ни о какой разнице, и я предпочитаю инициализацию в объявлении переменной.

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