2013-06-27 3 views
22

Я хочу знать, как частный конструктор полезен в java. , которые представляют собой различные способы использования частного конструктора в java.Что такое частный конструктор в java

+2

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

+0

Возможный дубликат - http: // stackoverflow.com/questions/2816123/can-a-constructor-in-java-be-private – mtk

+0

@R Martinho Fernandes Я хочу ответить на этот вопрос относительно C++ тоже ... –

ответ

0

Когда вы не хотите, чтобы какой-то конкретный класс был создан.

+0

+1 - истинный ан. – Krishna

2

В дополнение к другим ответам:

Если вы хотите создать одноэлементный класс, вам нужно скрыть конструктор, поэтому его можно назвать только внутренне.

+0

Могу ли я получить пример этого .... –

+0

Да, см. Другие 50 ответов, сообщающих вам то же самое :-D –

4

Использование частного конструктора останавливает его создание чем-либо «вне» объекта. Это часто используется в таких вещах, как шаблон singleton, где он пытается обеспечить только один экземпляр класса.

This link also предлагает некоторые хорошие описания ...

1

ИМХО некоторые использования являются

  1. в Singleton
  2. из другого конструктора ..
7

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

Случай 1: При создании sington classs

public class SingletonClass { 

    public static SingletonClass singletonClass; 

    private SingletonClass() { 
    } 

    public static SingletonClass getInstance() { 
     if(singletonClass == null) { 
      singletonClass = new SingletonClass(); 
     } 
     return singletonClass; 
    } 
} 

В этом случае только intialization делается методом GetInstance. Никто не может создать объект SingletonClass на внешней стороне.



Случай 2:, когда вы не хотите какой-либо экземпляр объекта, как в Util классы

public final class Util { 

    private Util() { 
    } 
} 

В классе UTIL все методы являются статическими, так нет необходимости создания своего объекта, так в в этом случае используется частный конструктор

+0

Согласно http://stackoverflow.com/questions/323022/static-class-vs-class- with-private-constructor-and-all-static-properties-and-me Я думаю, что со статическим классом util вам не нужно создавать частный contructor. –

+1

@ZuzooVn в java вы не можете создавать класс как статический. Вопрос, который вы упомянули в комментарии, основан на языке C# –

+0

*** «Никто не может создать объект SingletonClass извне». *** Что делать, если внешняя сторона имеет значение SingletonClass s = SingletonClass.getInstance(); ? Я считаю, что преимущество в вашем примере состоит в том, чтобы предотвратить появление нескольких экземпляров SingletonClass. –

35

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

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

public class ClassicSingleton { 
    private static ClassicSingleton instance = null; 
    private ClassicSingleton() { 
     // Exists only to defeat instantiation. 
    } 
    public static ClassicSingleton getInstance() { 
     if(instance == null) { 
     instance = new ClassicSingleton(); 
     } 
     return instance; 
    } 
} 

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

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

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

Can a constructor in Java be private?

What is the use of making constructor private in a class?

private constructor

4

Некоторые причины, где вам может понадобиться частный конструктор:

для предотвращения экземпляр вне объекта, в f ollowing случаи:

  1. одноэлементные

  2. фабричный метод

  3. статические-методы только (полезность) класса

  4. константы только для класса

Вы можете также см. этот код:

public class MySingletonEx 
{ 

    private static MySingletoneEx instance = new MySingletonEx("This takes a string");; 

    private MySingletonEx(final String myString) 
    { 
     // This is a private constructor 
    } 

    public static MySingletonEx getInstance() 
    { 
     return instance; 
    } 
} 
0

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

Например:

public class Color 
{ 
    public static final Color red = new Color("red"); 
    public static final Color yellow = new Color("yellow"); 
    public static final Color blue= new Color("blue"); 

    private Color(String name) { 
     this.name = name; 
    } 

    . 
    . 
    . 
} 

Это использование в основном вытеснили Java перечислений, однако.

7

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

Java не поддерживает то, что в C# (например) известен как «статический класс »- другими словами, полезный класс . Класс утилиты - это вспомогательный класс, который должен содержать только статические элементы. (Math и System - такие случаи в Java.) Для них не имеет смысла создавать экземпляр каким-либо образом.

В C# создание статического класса делает его неявным как окончательным/герметичным, так и абстрактным. В Java нет такого ключевого слова, и вы не можете сделать окончательный класс и аннотация. Поэтому, если у вас есть такой класс утилиты, вы бы сделали его окончательным и предоставили ему частный конструктор, который никогда не вызывался.

+0

BTW Новый подход к статическому классу - это 'enum'. –

+1

@MarkoTopolnik Можете ли вы привести пример? –

+1

'public enum Utility {; public static void fn1() {}} ' –

1

Вы не можете пользователи класса инстанцировать его непосредственно, но вместо того, чтобы использовать удобный статический метод вместо этого, для очень надуманного примера строителя:

public FooBuilder { 

    private FooBuilder(FooBar bar) { 
     ... 
    } 

    public static FooBuilder using(FooBar bar) { 
     return new FooBuilder(bar); 
    } 

} 

Вы затем использовать его, вызвав статический метод:

FooBuilder.using(bar) // further chained methods etc...