Там нет конструктора для интерфейса в Java?
В Java, если у меня есть интерфейс:
public interface MyInterface{
}
затем MyInterface
реализация это:
class MyClass implements MyInterface {
public MyClass(int a) {
}
}
Так что я имею в виду, что если пользователь хочет объявить MyInterface
экземпляр с конструктором:
MyInterface mine = new MyInterface(2);
тогда это не возможно, верно?
6 ответов
MyInterface mine = new MyInterface(2);
тогда это не возможно, верно?
Вот так. Вы никогда не можете сделать что-то вроде
MyInterface mine = new MyInterface(2);
После new
Вы должны выбрать класс, который реализует интерфейс (*), такой как MyClass
:
MyInterface mine = new MyClass(2);
Зачем?
Вы можете рассматривать интерфейс как свойство класса. Аналогия будет прилагательное, например, "красный". Имеет смысл создать, скажем, красный шар (new RedBall()
) или красная машина (new RedCar()
), но просто создаю "красный" (new Red()
) не имеет смысла ("красный что??").
(*) Вы можете создавать анонимные классы, которые реализуют интерфейс на лету, выполнив new MyInterface() { ... }
но с технической точки зрения вы все еще создаете экземпляр класса.
Ты прав. Интерфейс может не указывать конструктор, конструктор указывается в классе, который реализует интерфейс.
public interface Foo {
public void doSomething();
}
public class Bar implements Foo() {
public Bar(int value) {
}
@Override
public void doSomething() {
}
}
тогда, когда вы хотите использовать свой интерфейс, вам нужно сделать что-то вроде
Foo foo = new Bar(2);
Вы не можете создать экземпляр интерфейса напрямую. Вам нужно использовать экземпляр реализующего класса:
myClass mine = new myClassImpl();
Нет, невозможно объявить экземпляр myClass, так как это интерфейс.
Интерфейсы не определяют конструктор, но класс, реализующий интерфейс, все еще имеет конструктор.
Если вы намерены сделать невозможным для пользователя вызвать конструктор вашего класса, вы всегда можете сделать конструктор закрытым.
Невозможно определить сигнатуру конструктора в интерфейсе Java.
Если вы хотите обеспечить создание объектов с использованием определенной подписи, вы можете выбрать следующие шаблоны проектирования:
Правда, это невозможно. То, что вы хотите сделать, может быть выполнено, следуя заводской схеме. Одна вещь, которую код, который вы указали в своем вопросе, не указывается, это то, какой класс, реализующий ваш интерфейс, вообще должен быть создан. Ваша фабричная реализация - это место, где вы выражаете свои намерения по этому поводу в коде. Схема для фабрики может быть что-то вроде этого, чтобы вы начали:
public class FooFactory {
public myClass createFoo() {
if (/* some condition */) {
return new myClassImpl(/* the constructor parameters for that implementation */);
} else {
/* return some other implementation; you get the idea */
}
}