В чем разница между классом final и конструктором класса как private - PullRequest
17 голосов
/ 07 сентября 2011

В чем разница между конечным классом и конструктором класса в качестве частного.

Я знаю, что оба не могут быть разделены на подклассы (поправьте меня, если я ошибаюсь). Есть ли их разница?

Ответы [ 6 ]

9 голосов
/ 07 сентября 2011

Последний класс не может быть продлен. Это предотвращает это

final class FinalClass {

}

// and later

class ExtendedClass extends FinalClass { // ERROR

}

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

Закрытый конструктор не может быть вызван вне класса.

class PrivateCons {

    private PrivateCons() {

    }
}

// later
PrivateCons pc = new PrivateCons(); // ERROR

Часто это в конечном итоге работает так: (хороший пример - java.lang.Math)

class FuncLib {
    private FuncLib() { } // prevent instantiation
    public static void someFunc(...) { }
    public static int anotherFunc(...) { }
}

Или это в конечном итоге работает так // Integer делает это на самом деле

class VerySpecial {

    private static Map<String,VerySpecial> cache;

    public static VerySpecial generate(String data) {
        VerySpecial result = cache.get(data);
        if(result == null) {
            result = new VerySpecial(data);
            cache.put(data,result);
        }
        return result;
    }

    private String data;

    private VerySpecial() { }

    private VerySpecial(String data) { this.data = data}

}

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

5 голосов
/ 07 сентября 2011

Инстанцирование

  • Вы не можете создать экземпляр класса с закрытым конструктором. Но вы можете использовать его как служебный класс со статическими методами.
  • Последний класс может быть создан, но не расширен, очевидно, вы не можете расширить класс с помощью закрытый конструктор, так как неявный вызов super () потерпит неудачу.

Посмотрите на класс Math, он имеет закрытый конструктор, не может быть создан, но имеет много статических методов, которые очень полезны

1 голос
/ 07 сентября 2011

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

1 голос
/ 07 сентября 2011

Наличие только частных конструкторов сильнее, чем окончательный класс.

Подробно: Наличие только частных конструкторов в классе A сильно влияет на создание объекта. Обычно вы используете фабричный метод. Вы по-прежнему можете создавать экземпляры A без метода фабрики, используя такие приемы, как clone () или рефлексивный вызов частного конструктора. Но подклассы невозможны , потому что конструктор подкласса должен иметь возможность вызывать super(). Это было бы возможно только во вложенном классе внутри A.

Часто имеет смысл иметь только частные конструкторы, например управлять экземплярами с помощью заводских методов, например, для одиночных кнопок (см. пункт 3 «Эффективная Java»). Но даже в этом случае я не вижу причины не писать «окончательный класс», хотя бы для документации, чтобы читатели сразу поняли, что подклассы не допускаются.

0 голосов
/ 03 июня 2017

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

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

public class Singleton{    
private static final Singleton instance = new Singleton();

//private constructor to avoid client applications to use constructor
private Singleton(){}

public static Singleton getInstance(){
    return instance;
}}

И, например, класс String в Java является окончательным классом.

0 голосов
/ 07 сентября 2011

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

public class Outer {
  private Outer() {
    System.out.println("Outer()");
  }

  static class Inner extends Outer {
    {
      System.out.println("Inner()");
    }
  }

  public static void main(String... args) {
    new Inner();
  }
}

print

Outer()
Inner()

Последний класс не может быть расширен, но его конструктор может быть открытым.Закрытый конструктор может вызываться из другого конструктора или использоваться внутренним классом.

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