2012-09-05 5 views
4

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

public class MyClass { 
    private MyClass(int i) { } 

    public MyClass createMyClassInt(int i) { 
     return new MyClass(i); 
    } 

    private MyClass(double d) { } 

    public MyClass createMyClassDouble(double d) { 
     return new MyClass(d); 
    } 
} 

Таким образом, когда пользователь пытается создать экземпляр MyClass myClass = new MyClass();, компилятор выдаст сообщение об ошибке.

+0

Вы пробовали код? – gefei

+3

Это то, что он делает сейчас. Можете ли вы сказать, как этот код не делает то, что вы хотите? (Вы можете отформатировать его более красиво;) –

+0

@ Rp-: не нужно, если есть уже другие (частные) конструкторы. –

ответ

11

Ваш код почти прекрасно - все, что вам нужно, чтобы сделать ваши create статические методы, и дать им тип возвращаемого значения:

public static MyClass createMyClassInt(int i) { 
    return new MyClass(i); 
} 

public static MyClass createMyClassDouble(double d) { 
    return new MyClass(d); 
} 

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

EDIT: Как было отмечено в комментариях, это, вероятно, также стоит сделать класс final.

+3

Я бы сделал класс 'final', чтобы показать намерение. –

+0

@JoachimSauer: Верно, отредактирует. –

+0

Можете ли вы сказать мне, если используется один сингл, тогда все будет хорошо? –

3

Если вы хотите создать свой класс по специальному методу, почему бы не использовать шаблон проектирования завода? Статический метод внутри вашего класса, который возвращает вам новый экземпляр класса

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

Смежные вопросы