Java Финальный класс или частный конструктор - PullRequest
2 голосов
/ 23 марта 2020

Когда мы хотим закрыть класс для наследования, мы объявляем класс с final,

final class Myclass {}

, но когда мы объявляем конструктор частным, это будет тот же эффект,

class Myclass {
     private Myclass() {}
}

Но так ли это на самом деле? Есть ли разница для оптимизации кода или читабельности кода? И какие классы должны быть близки к наследованию,

  1. неизменяемый класс может быть
  2. , каждый метод и переменная-член объявили stati c класса

Но для второй параметр java.util.Arrays не был объявлен с final, даже если все методы Arrays объявлены static.

Ответы [ 3 ]

3 голосов
/ 23 марта 2020

, но когда мы объявляем ctor private, это будет тот же эффект

Не обязательно, рассмотрим этот пример с использованием stati c classes:

public class SOExample {
    private static class ClassWithPrivateConstructor {
        private ClassWithPrivateConstructor() {
            System.out.println("I have a private constructor");
        }
    }

    private static class ClassThatExtendsClassWithPrivateConstructor extends ClassWithPrivateConstructor {
    }

    public static void main(String[] args) {
        new ClassThatExtendsClassWithPrivateConstructor();
    }
}

This напечатает «У меня есть личный конструктор».

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

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

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

Но для второго варианта java .util.Arrays не объявлен с final, даже если все методы Arrays заявлено: c

Это хорошее наблюдение. Я предполагаю, что это, вероятно, должно было быть, но не может быть изменено сейчас для обратной совместимости.

1 голос
/ 23 марта 2020

Обычно я делаю класс final и конструктором private:

  1. , что устраняет неоднозначность использования класса (подчеркивая, что это утилита класс)
  2. он удерживает пользователя от того, что он не должен делать (инициировать, расширять).

.

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class HttpTool {}

Тем не менее, нет ничего плохого в java.util.Arrays. Дизайнер достигает желаемого эффекта (неинстанцируемости) с необходимым минимумом (приватный конструктор).

0 голосов
/ 23 марта 2020

Если вы хотите создать неизменяемый класс или просто класс, который по каким-то причинам не должен иметь дочерних, вы должны объявить его как final. Закрытый конструктор должен использоваться в служебных классах, таким образом вы блокируете наследование, а также убедитесь, что экземпляр класса не может быть создан.

...