Hallo derletztekick,
Also zuerst einmal würde es stark zur Übersichtlichkeit beitragen, wenn Du Dir überflüssige Verwenung von "this" sparst ;-)
Wenn Du Deine Datenstruktur nicht verändern willst, musst Du irgendwie den Parameter, auf den zugegriffen werden soll, parametrisieren. Dafür gibt es im Wesentlichen zwei Lösungsmöglichkeiten:
1. Annonyme Klasse und Interface:
public static interface Parameter {
double getValue();
}
public void getParameters(double value, Parameter parameter){
int loop = 0;
while (Math.abs(end_index - start_index) > tol && ++loop < stop_loop && end_index > start_index) {
getParametersFromL(0.5 * (start_index + end_index));
if (parameter.getValue() > value) {
end_index = 0.5 * (start_index + end_index);
} else if (parameter.getValue() < value) {
start_index = 0.5 * (start_index + end_index);
} else {
break;
}
}
}
//Aufruf:
getParameters(value, new Parameter() {public double getValue() {return x}});
2. Reflection
impor java.lang.reflection.Field;
public void getParameters(double value, Field parameter){
int loop = 0;
while (Math.abs(end_index - start_index) > tol && ++loop < stop_loop && end_index > start_index) {
getParametersFromL(0.5 * (start_index + end_index));
if (parameter.getDouble(this) > value) {
end_index = 0.5 * (start_index + end_index);
} else if (parameter.getDouble(this) < value) {
start_index = 0.5 * (start_index + end_index);
} else {
break;
}
}
}
//Aufruf:
getParameters(value, getClass().getField("x"));
Die andere (vermutlich elegantere) Möglichkeit ist, Parameter nicht als Felder zu definieren, sondern in einer Tabelle zu verwalten:
import java.util.EnumMap;
public enum Parameter {X, Y, Z};
private EnumMap<Parameter, Double> parameter = new EnumMap<Parameter, Double>();
public void getParameters(double value, Parameter p){
int loop = 0;
while (Math.abs(end_index - start_index) > tol && ++loop < stop_loop && end_index > start_index) {
getParametersFromL(0.5 * (start_index + end_index));
if (parameter.get(p) > value) {
end_index = 0.5 * (start_index + end_index);
} else if (parameter.get(p) < value) {
start_index = 0.5 * (start_index + end_index);
} else {
break;
}
}
}
//Aufruf:
getParameters(value, Parameter.X);
Diese Variante kann man natürlich auch ohne Enumerationen realisieren, wenn man eine ältere Java-Version verwendet. Außerdem könnte man statt der EnumMap einen Array verwenden, falls man die Wrapper-Objekte vermeiden will. Das ist aber nur interessant, wenn mit diesen Parametern so viel gearbeitet wird, dass das Performancevorteile bringt.
Grüße
Daniel