В чем разница между наличием класса как final и наличием конструктора класса как private

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

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

6 ответов


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

final class FinalClass {

}

// and later

class ExtendedClass extends FinalClass { // ERROR

}

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

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

class PrivateCons {

    private PrivateCons() {

    }
}

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

часто это заканчивается работает следующим образом: (java.ленг.Математика-хороший пример)

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}

}

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


экземпляров

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

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


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


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

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

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


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();
  }
}

печать

Outer()
Inner()

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


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

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

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 является конечным классом.