これはアノテーションを使用して行うことができます。これは、あなたが提案した方法とまったく同じです。あなたは、実際の例外処理を行うことになるでしょう、明らかに
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException{
StrategyFactory factory = new DefaultStrategyFactory();
ThirdPartyClass obj = new ThirdPartyClass();
Class<ThirdPartyClass> clazz = (Class<ThirdPartyClass>) obj.getClass();
for(Field field : clazz.getDeclaredFields()){
FormatStrategy fmtStrategy = field.getAnnotation(FormatStrategy.class);
if(fmtStrategy != null){
FormattingStrategy strategy = factory.getStrategy(fmtStrategy);
String formattedNumber = strategy.formatNumber(field.getInt(obj));
// use the formatted number
}
}
}
:ここ
class ThirdPartyClass {
@FormatStrategy(fmt="unsigned8",offset=0)
int memberA;
@FormatStrategy(fmt="unsigned16",offset=1)
int memberB;
@FormatStrategy(fmt="unsigned16",offset=3)
int memberC;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FormatStrategy{
String fmt() default "unsigned8";
int offset()default 0;
}
interface FormattingStrategy{
String formatNumber(int number);
}
class BasicFormattingStrategy implements FormattingStrategy{
private String fmt;
private int offset;
private BasicFormattingStrategy(String fmt, int offset) {
this.fmt = fmt;
this.offset = offset;
}
@Override
public String formatNumber(int number) {
// do formatting here
return "formatted number";
}
}
interface StrategyFactory{
FormattingStrategy getStrategy(FormatStrategy fmtStrategy);
}
class DefaultStrategyFactory implements StrategyFactory{
@Override
public FormattingStrategy getStrategy(FormatStrategy fmtStrategy) {
// right now only one strategy implementation exists, but may have many.
return new BasicFormattingStrategy(fmtStrategy.fmt(), fmtStrategy.offset());
}
}
が実際に戦略を使用するコードのようになります。これは、サンプル実装だろう、それはまた、
AbstractFactory
パターンを使用しています/エラーチェック。