2016-03-16 3 views
0

Я в ситуации, когда мне нужны все мои дочерние классы для реализации общего абстрактного метода родительского класса ... static. Но, по-видимому, Java не допускает абстрактных статических методов ...Альтернатива статических абстрактных методов в Java

Итак, что такое альтернативный дизайн такой реализации на Java? Ниже приведен код, который описывает ситуацию, я нахожусь в:

Родитель класса

public abstract class ParentFactory { 
    /** 
    * This is a factory class that provides static init method 
    **/ 
    public abstract static void init(); 
} 

класса Child

public class ChildFactory extends ParentFactory { 
    @Override 
    public static void init() { 
     // each child factory has own implementation of init 
    } 
} 

EDIT

FYI, я не спрашиваю, почему это недействительно в Java, я понимаю концепцию статического метода, я знаю, почему это запрещено в Java.

Вместо этого я обращаюсь за помощью к альтернативному шаблону относительно моего подхода выше. Благодаря!

+1

Возможно, это будет лучше, если вы сделаете 'init()' virtual и будете использовать 'Factory' как singleton? Виртуальный метод по-прежнему может получить доступ к статическим членам. –

+0

Привет @KenBekov, не могли бы вы подробнее рассказать о своей идее? (возможно, как ответ?) Мне бы очень хотелось услышать отличные мнения о вашем предлагаемом дизайне. –

+1

Я не понимаю, с какой целью вы статируете 'init()'. Наверное, для инициализации каких-то статических членов. Но виртуальный метод тоже может это сделать. Обычно статический метод играет роль фабричного метода. Но ваш метод ничего не возвращает. Таким образом, информации недостаточно, чтобы предложить что-то конкретное. –

ответ

1

Я думаю, ваша проблема заключается в понимании картины фабрики. Типичным ответом на ваш вопрос будет «использование шаблона фабрики». Потому что на заводе вы можете вызвать init на конкретном экземпляре. Если вы не используете инъекцию зависимостей и не используете свободную связь посредством инверсии управления, завод обычно реализуется как одиночный. Это нужно, чтобы получить его из любого места, и должен быть только один экземпляр фабрики.

Короче говоря, если вы хотите инициализировать завод, потому что вы хотите подклассифицировать завод (что не имеет особого смысла IMHO), вам необходимо создать фабрику, которая создаст фабрику.

+0

Спасибо, сэр, вы точно на месте. После вопроса я внимательно рассмотрел заводскую модель и теперь переписываю свой код. Ура! –

+0

Добавляем две вещи, если вы используете фреймворк вроде Spring (не говоря, что вам нужно), вы можете использовать метод init, который будет вызываться после создания объекта. Это дает вам некоторое поведение Factory, не создавая его как Factory. Во-вторых, если вы хотите увидеть живой пример Factory, вы можете увидеть его здесь: https://app.pluralsight.com/player?course=design-patterns-java-creation&author=bryan-hansen&name=design-patterns-java -creational-m5-завод & клип = 0 & режим = живой – bh5k

1

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

Статический код код относящийся к классу, а не к объекту или экземпляру.

вам нужно изменить код ...

+0

Привет, спасибо за ваш ответ, плз см. Мой вопрос, обновленный выше. –

2

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

+0

Привет, спасибо за ваш ответ, плз см. Мой вопрос, обновленный выше. –

+0

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

+0

Это фактически не сработает, как отметил ОП. Статические методы не наследуются. –

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