new trick

May. 25th, 2007 05:26 pm
juan_gandhi: (Default)
[personal profile] juan_gandhi
I wonder how obvious or how stupid or how ubiquitous is the following trick:

Say, I have an enum somewhere outside of my realm:
enum DataType { 
  PERSONAL,  COMMUNITY, PRISON, ARMY;
};

....





and my method takes an instance of that enum, and I really do not like switching based on the enum; of course I can have an
EnumMap
, but the funny trick is that my strategies are based on this enum type, so I can do just this:
enum Strategy { 
  PERSONAL {
    public void process(Entity entity) {...};
  }, 
  COMMUNITY {
    public void process(Entity entity) {...};
  }, 
  PRISON {
    public void process(Entity entity) {...};
  }, 
  ARMY {
    public void process(Entity entity) {...};
  }

  abstract public void process(Entity entity);
  DEFAULT{
    public void process(Entity entity) {...};
  };

  abstract public void process(Entity entity);

(and so on, add functionality here )

  Strategy forDataType(DataType type) {
    Strategy candidate = valueOf(type.name());
    return candidate == null ? DEFAULT : candidate;
  }
};
....


Strategy.forDataType(myType).process(myEntity);




(PURPLE STUFF ADDED LATER)


Is not it a poetry? :)

Date: 2007-05-26 03:15 pm (UTC)
From: [identity profile] http://users.livejournal.com/d_m_/
Там не совсем reflection, но поиск элемента по имени, причём путём полного перебора элементов enum #1. В настоящем mapping всё-таки есть хеширование. Но если автору так не нравится Map, почему бы не делать так, как положено, т.е. в каждый элемент enum #2 поместить элемент из enum #1, задавая эту связь в конструкторе? И работает шустрее некуда, и assert не просит :)

Date: 2007-05-26 06:38 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
В каком конструкторе?

Проблема-то в следующем. Нам в метод поступает DataType; надо получить соответствующую стратегию. Ну типа factory вызвать. Ну так эта фабрика-то как работает? А вот я и предложил, как фабрика работает.

Date: 2007-05-26 08:04 pm (UTC)
From: [identity profile] http://users.livejournal.com/d_m_/
Я имел в виду вот что:
enum Strategy { 
  PERSONAL,  COMMUNITY, PRISON, ARMY;
};

enum DateType {
  
  PERSONAL(Strategy.PERSONAL),  
  COMMUNITY(Strategy.COMMUNITY),  
  PRISON(Strategy.PRISON),  
  ARMY(Strategy.ARMY);  
 
  private Strategy strategy;
  private DataType( Strategy strategy){this.strategy=strategy};

  public static strategyForType(DataType type){return type.strategy};
  public getStrategy(){return strategy};
}


Никаких хаков, никаков поисков перебором, никаких согласований по именам-идентификаторам.

Date: 2007-05-26 10:03 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Да это очевидное решение если мы хотим добавить зависимость DataType от Strategy. Что очень неестественно.

Date: 2007-05-26 10:06 pm (UTC)
From: [identity profile] http://users.livejournal.com/d_m_/
Ок, теперь я уже вижу первую фразу поста :)

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

June 2025

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 1st, 2025 09:29 pm
Powered by Dreamwidth Studios