mental.dIseASe
Lieutenant
- Registriert
- Dez. 2008
- Beiträge
- 665
Hallo liebe Kollegen,
ich habe folgende Klasse:
Das heißt, ich habe eine Klasse, bei deren Instanziierung jeweils schon feststeht, wie sich retrieveThingToUse für dieses eine Objekt immer verhalten wird. Angenommen es wird jetzt vielfach doIt aufgerufen, dann ist es doch irgendwie doof, dass immer wieder die Prüfung gegen retrieveItTheSpecialWay ausgeführt wird. Ich vermute, dass man hier richtigerweise wohl eine Klassenhierarchie aufbauen würde, um das zu refactorn. Angenommen, man will diesen Schritt aber nicht gehen, wäre es dann nicht auch möglich, hier folgendes zu tun?
In dem Fall hätte ich die Abfrage gegen das Flag nur noch einmal bei der Instanziierung und nicht in jedem Aufruf von doIt. Meine Fragen lauten jetzt:
1. Bin ich damit tatsächlich schneller unterwegs oder gibt es bei Functional Interfaces irgendwelchen Overhead, den ich übersehe? (Ich bin übrigens zu faul zum Messen)
2. Optimiert die JVM sowas schon adaptiv für mich und ich kann mir das sparen, es also so lassen wie im ersten Code-Schnipsel?
Das Refactoring wird übrigens wohl den Aufbau einer Klassenhierarchie umfassen, aber mich interessieren diese Fragen aus theoretischer Perspektive.
zum Gruße
mental
ich habe folgende Klasse:
Java:
public class MyClass {
private final boolean retrieveItTheSpecialWay;
public MyClass(final boolean retrieveItTheSpecialWay) {
this.retrieveItTheSpecialWay = retrieveItTheSpecialWay;
}
public void doIt() {
final Thing thingToUse = retrieveThingToUse();
useIt(thingToUse);
}
private Thing retrieveThingToUse() {
if (retrieveItTheSpecialWay) {
return retrieveItTheSpecialWay();
} else {
return retrieveItTheRegularWay();
}
}
private Thing retrieveItTheSpecialWay() {
return //some supplying Logic
}
private Thing retrieveItTheRegularWay() {
return // some different supplying logic
}
private void useIt(final Thing thingy) {
}
}
Das heißt, ich habe eine Klasse, bei deren Instanziierung jeweils schon feststeht, wie sich retrieveThingToUse für dieses eine Objekt immer verhalten wird. Angenommen es wird jetzt vielfach doIt aufgerufen, dann ist es doch irgendwie doof, dass immer wieder die Prüfung gegen retrieveItTheSpecialWay ausgeführt wird. Ich vermute, dass man hier richtigerweise wohl eine Klassenhierarchie aufbauen würde, um das zu refactorn. Angenommen, man will diesen Schritt aber nicht gehen, wäre es dann nicht auch möglich, hier folgendes zu tun?
Java:
public class MyClass {
private final Supplier<Thing> retriever;
public MyClass(final boolean retrieveItTheSpecialWay) {
this.retriever = retrieveItTheSpecialWay ? this::retrieveItTheSpecialWay : this::retrieveItTheRegularWay;
}
public void doIt() {
final Thing thingToUse = retriever.get();
useIt(thingToUse);
}
private Thing retrieveItTheSpecialWay() {
return //some supplying Logic
}
private Thing retrieveItTheRegularWay() {
return // some different supplying logic
}
private void useIt(final Thing thingy) {
}
}
In dem Fall hätte ich die Abfrage gegen das Flag nur noch einmal bei der Instanziierung und nicht in jedem Aufruf von doIt. Meine Fragen lauten jetzt:
1. Bin ich damit tatsächlich schneller unterwegs oder gibt es bei Functional Interfaces irgendwelchen Overhead, den ich übersehe? (Ich bin übrigens zu faul zum Messen)
2. Optimiert die JVM sowas schon adaptiv für mich und ich kann mir das sparen, es also so lassen wie im ersten Code-Schnipsel?
Das Refactoring wird übrigens wohl den Aufbau einer Klassenhierarchie umfassen, aber mich interessieren diese Fragen aus theoretischer Perspektive.
zum Gruße
mental