Daniel Thoma: in einer Methode zusammenfassen

Beitrag lesen

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