2015-06-13 3 views
1

я следующий код:Java абстрактный метод: это плохая практика?

 public static final Condition.ActionCondition ACTION_CONDITION_ACTIVATE = new Condition.ActionCondition(ACTION_CONDITION_ACTIVATE_ID, "Activate") 
     { 
      private static final long serialVersionUID = 5660276607942658334L; 

      @Override 
      public Object action(Object... params) 
      { 
       return null; 
      } 
     }; 

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

Идея ActionConditions состоит в том, что они имеют целое число, представляющее их условие, в данном случае ACTION_CONDITION_ACTIVATE_ID, имя в данном случае «Активировать» и, наконец, метод, который что-то делает. Метод может возвращать что-либо, делать все, что он хочет, и иметь что-либо в качестве параметров.

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

ответ

2

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

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

Не зная гораздо больше о том, что вам нужно делать с таким классом, трудно сделать рекомендацию, но мне кажется, что использование generics могло бы вам помочь. Вместо того, чтобы передавать только идентификатор действия, чтобы определить, что будет делать класс, экземпляр объекта может также предоставить требуемые параметры типа для определения того, что метод действия примет и вернет.

После кода выше, использование анонимного класса будет выглядеть примерно так:

public static final Condition.ActionCondition<MyReturnType,MyParamType1,MyParamType2> ACTION_CONDITION_ACTIVATE = new Condition.ActionCondition<MyReturnType,MyParamType1,MyParamType2>(ACTION_CONDITION_ACTIVATE_ID, "Activate") 
    { 
     private static final long serialVersionUID = 5660276607942658334L; 

     @Override 
     public MyReturnType action(MyParamType1 param1, MyParamType1 param2) 
     { 
      return null; 
     } 
    }; 

Это предполагает абстрактный класс для ActionCondition объявленного внутри Condition класса что-то вроде этого:

public static abstract class Condition.ActionCondition<R,P1,P2> extends Condition{ 
    public abstract R action(P1 param1,P2 param2); 
} 

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

Примечание: Из вашего описания, похоже, вы описывали использование анонимного класса как объявление абстрактного класса. Это, скорее всего, незначительная неправильная формулировка, но это в сочетании с некоторой вашей типичной структурой заставляет меня задаться вопросом, возможно ли, что у вас нет большого понимания абстрактных и/или анонимных классов. Если мое объяснение, приведенное выше, имеет смысл для вас, вы можете попробовать прочитать о различиях между Nested Classes, abstract classes и anonymous classes

+0

Только то, что я искал! Вы совершенно правы в отношении любого параметра, поражающего безопасную часть типа Java. Дженерики - это путь. Не могу поверить, что я об этом не думал! Спасибо! –

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