Я бы использовал аннотации для рассматриваемых методов, позволяя пометить его как «метод с тегами» и предоставив строку тега для использования с этим методом.
С этого момента реализация становится проще; вы можете использовать рефлексию для перебора методов класса и проверки их аннотаций; возможно, сделать это статически при запуске и заполнить отображение из строки тега в java.lang.reflect.Method.
Затем при обработке командной строки вызывайте методы, соответствующие каждому тегу.
Редактировать: пример кода:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface TaggedMethod {
String tag();
}
Тогда в базовом классе:
public class Base {
@TaggedMethod(tag = "A")
public void method1(){
..change state of base class
}
@TaggedMethod(tag = "B")
public void method2(){
..change state of base class
}
@TaggedMethod(tag = "C")
public void method3(){
..change state of base class
}
}
... и в клиенте:
private static final Map<String, Method> taggedMethods = new HashMap<String, Method>();
// Set up the tag mapping
static
{
for (Method m : Base.class.getDeclaredMethods())
{
TaggedMethod annotation = m.getAnnotation(TaggedMethod.class)
if (annotation != null)
{
taggedMethods.put(annotation.tag(), m);
}
}
}
так что вы можете получить доступ к этому как:
public static void main(String[] args) throws Exception
{
String sequence = "ABCAABBBABACCACC"
Base aBase = new Base();
for (int i = 0; i < sequence.length(); i++)
{
String temp = sequence.substring(i,1);
Method method = taggedMethods.get(temp);
if (method != null)
{
// Error handling of invocation exceptions not included
method.invoke(aBase);
}
else
{
// Unrecognised tag - handle however
}
}
System.out.println(aBase.getState());
}
Кстати, этот код не был скомпилирован или протестирован ...: -)