Gutes Design mit statischen oder Member-Methoden

samosa

Mitglied
Hi,

ich habe eine Design-Frage. Angenommen wir haben folgende Beispielklasse:

Java:
public class Value {

    private double val;
    
    public Value(double val) {
        this.val = val;
    }

    public void add(Value value) {
        if(value != null) {
            this.val += val;
        }
    }
}

Betrachte den folgenden Code:

Java:
Value v = new Value(1);
Value[] values = {new Value(2), null, new Value(1)};
for(int i = 0; i < values.length; i++) {
    if(value[i]!= null) {
        values[i].add(v);
    }
}

Man stelle sich vor man hat weitere arithmetische Operationen und Arrays von values, die man manipulieren möchte. Mich stört hier, dass ich jedesmal wenn ich eine arithmetische Operation aufrufe, eine Abfrage machen muss, ob das entsprechende Array-Element ungleich
Code:
null
ist. Ein Ausweg wäre zusätzlich statische Methoden zu verwenden, etwa

Java:
public Value void add(Value u, Value v) {
    if(u != null) {
        return u.add(v);
    }
    return v;
}

Hier ist es hässlich, sowohl statische als auch Membermethoden mit der gleichen Funktionalität zu besiten. Würde ich komplett auf Membermethoden verzichten, so bräuchte ich statische Methoden, die das erste Argument verändern.

Wie würde hier denn unter der Bedingung, dass man bei einer arithmetischen Operation kein neues Objekt erzeugt ein gutes Design aussehen?

Beste Grüße

samosa
 
Zuletzt bearbeitet:
M

maki

Gast
Diese statische Alternative wäre imho nicht schön.

Dein Problem ist imho eher, dass du Arrays verwendest.
Nimm gleich eine Collection, und füge kein null ein.
 

samosa

Mitglied
Danke für den Tip. Ich habe es eigentlich mit 2-dimensionalen und 3-dimensionalen Arrays zu tun. Performancetests haben ergeben, dass mir Collections für mein Problem zu langsam sind. Geschwindigkeitsvorteile treten erst bei dünn bestzten Arrays auf.
 
Zuletzt bearbeitet:
D

Dow Jones

Gast
Oder fange die Nullpointer Exception ab und ignoriere sie... :D
Hmm, ein "schönes" Design würde hier aber glaube ich gar nicht erst mit Nullpointern arbeiten. Bestenfalls mit Nullobjekten, also einer Implementation des Value-Interfaces (das müsste dann natürlich erstellt werden), die ggf. keinerlei Funktionalität besitzt und nur dazu dient zwischen einem wirklichen Valueobjekt und einem nicht vorhandenen Valueobjekt (also dem, was z.Z. der Nullpointer ist) zu unterscheiden.
 
M

maki

Gast
Darf man nach dem Performanceproblemen bzw. deinem Anwendungsfall fragen?

ArrayList sind Arrays von der Performace sehr ähnlich, beim entfernen von elementen allerdings... :(
LinkedList wäre eine Alternative, ausser du brauchst wahlfreien (Indexbasierten) Zugriff.
 

samosa

Mitglied
@Dow Jones
Ich bin mir nicht sicher ob ich das verstanden habe. Tausche ich da die null-Abfrage nicht durch eine
Code:
instanceof
Abfrage aus?
 

samosa

Mitglied
Wofür genau brauchst du denn die Klasse? Matrizen würd ich dann wirklich mit double[][] machen.

Das wären normale Matrizen mit rellwertigen Einträgen. Bei mir geht es um Matrizen deren Elemente Vektoren sind also von der Form double[][][]. Jedoch sind die Vektoren dünn besetzt. Deswegen betrachte ich die Klasse Value

Java:
class Value {

    double val;
    int index;

    Value(int index, double val) {...}
}

Einen Vektor der Form v = (1, 0, 3, 0, 0, 0, 2) kann ich dann durch einen Array der Form

Value[] v = {new Value(0, 1), new Value(2, 3), new Value(6, 2)}

repräsentieren. Da ich viel mit solchen Arrays arbeite definiere ich eine Klasse SparseVector die ein Value-Array als Attribut besitzt.

Meine Matrix ist dann von der Form SparseVector[][] wobei 0-Vektoren durch null repräsentiert werden.
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Java:
public static void add(Value u, Value v) {
    if(u != null) {
        return u.add(v);
    }
    return v;
}

return irgendwas; in einer void-funktion? Das geht ja schon gar nicht.
Mir ist schleierhaft wozu du die static funktion überhaupt brauchst.

Aber was ich sagen wollte:

Code:
if (x != null)...
ist wohl etwas vom schnellsten was es gibt.

Ich sehe minimes Optimierungspotential, wenn du den Wert zwischenspeicherst:

Java:
Value v = new Value(1);
Value[] values = {new Value(2), null, new Value(1)};
for(int i = 0; i < values.length; i++) {
    if(value[i]!= null) {
        values[i].add(v);
    }
}

Java:
Value v = new Value(1);
Value[] values = {new Value(2), null, new Value(1)};
Value vv;
for(int i = 0; i < values.length; i++) {
    vv = value[i];
    if(vv!= null) {
        vv.add(v);
    }
}

aber ob das messbar was bringt wage ich nicht zu beurteilen.
 

samosa

Mitglied
Java:
public static void add(Value u, Value v) {
    if(u != null) {
        return u.add(v);
    }
    return v;
}

return irgendwas; in einer void-funktion? Das geht ja schon gar nicht.
Mir ist schleierhaft wozu du die static funktion überhaupt brauchst.

Sorry, copy and paste Fehler. Danke für den Hinweis. Habe das oben wieder korrigiert.
 
M

maki

Gast
dann ist imho Dow Jones mit seinem NullOBject Tipp genau richtig :)

Definiere eine Unterklasse Value Klasse die sich anders verhält, eine einzige Instanz dieser Kalsse reicht(statisch, aber bitte kein GoF Singleton), so dass es keine Unterscheidung zwischen null und echten Value Objekten mehr nötig sind.

Zum Verhalten des NullObject:
Ein add ist ja nicht schlimm wenn wirklich nur 0 & 0.0 geadded wird, wenn dir das zuviel Rechenarbeit ist, kannst du ja in Value prüfen ob es sich um das NullObject handelt und nur adden wenn dem nciht so ist.
 
D

Dow Jones

Gast
@Dow Jones
Ich bin mir nicht sicher ob ich das verstanden habe. Tausche ich da die null-Abfrage nicht durch eine
Code:
instanceof
Abfrage aus?

Nicht direkt. Du erzeugst dir vielmehr ein Objekt, das du genauso behandeln kannst wie ein Valueobjekt (so daß du nicht mehr abfragen musst ob wirklich ein Objekt oder ein Nullpointer vorliegt), das aber keinerlei Auswirkungen auf dein Programm ausübt. Das könnte zum Beispiel so aussehen:

Java:
class NullValue implemens Value
{
    public NullValue(double val) {
        // mach nichts
    }
 
    public void add(Value value) {
        // mach nichts
    }
	
    public void zeichneValueInDiagramm() {
        // mach nichts
    }
}

Im Idealfall müsstest du dich in deinem gesamten Programm gar nicht darum kümmern ob du es mit wirklichen Values oder nur diesen Dummyobjekten zu tun hast. (Ja, die Praxis sieht zwar meistens nicht so ideal aus, aber ein schöner Entwurf ist es trotzdem :) ).

Siehe auch Nullobjekt (Entwurfsmuster) ? Wikipedia
 

Andi_CH

Top Contributor
Hm da stellt sich die Frage ob in die Dummyfunktion verzweigt wird - vermutlich schon und das ist dann auch nicht schneller als die
Code:
if (x!=null)
Abfrage, aber das Aufrufende Kontext sieht wesentlich eleganter aus.
 

samosa

Mitglied
@ANDI_CH

Es geht bei der Frage nicht so sehr um Optimierung des Codes, sondern mehr darum, wie man das vernünftig programmiert, ohne Collections zu verwenden. Mich stören im Code die ständigen Abfragen, ob das Objekt ungleich null ist. Würde ich statische Methoden verwenden, dann kann ich die null-Abfrage ein für alle male in der statischen Methoden implementieren und brauch mir um Null-Referenzen dann keine Gedanken machen.

Allerdings möchte ich dass bei statischen Methoden das erste Argument geändert wird, weil ich keine Kopien erzeugen möchte.
 
M

maki

Gast
Der Vorteil vom NullObject ist, dass man sich die null Abfragen sparen kann und sie deswegen auch nciht vergessen kann, also eine fehlerquelle eleminieren während man gleichzeitig weniger redundanten Code hat (null Abfragen quer über die Anwendung verstreut).

Beispiele aus der Java Collections API:
Collections.EMPTY_LIST
Collections.EMPTY_MAP
Collections.EMPTY_SET

Für typsichere Generics bieten die Methoden eine Alternative:
Collections.emptyList()
Collections.emptyMap()
Collections.emptySet()

Ist natürlich blöd wenn jemand versucht diese NullObjekte zu verändern ;)
 

samosa

Mitglied
@maki und Dow Jones

Ich bin mir unsicher ob ich das verstanden habe. Bedeutet das, dass ich in meinem Value-Array die null-Referenzen durch NullObjekte ersetzen müsste, also künstliche Objekte erzeugen müsste?
 

Andi_CH

Top Contributor
Mich stören im Code die ständigen Abfragen, ob das Objekt ungleich null ist. Würde ich statische Methoden verwenden, dann kann ich die null-Abfrage ein für alle male in der statischen Methoden implementieren und brauch mir um Null-Referenzen dann keine Gedanken machen.

Allerdings möchte ich dass bei statischen Methoden das erste Argument geändert wird, weil ich keine Kopien erzeugen möchte.

Jetzt verwirrst du mich:
Code:
static.add(v1, v2)
mach rein gar nichts anderes als
Code:
v1.add(v2)
Nach dem Aufruf ist das eine Objekt verändert und es gibt exakt gleich viele
Code:
if (x!=null)...
Abfragen ob die nun in der static Prozedur sind oder nicht, aber das Thema null-Abfrage ist mit dem Vorschlag von Dow jones ja erledigt. Übrigens sehr elegant wie ich finde.
 
M

maki

Gast
@maki und Dow Jones

Ich bin mir unsicher ob ich das verstanden habe. Bedeutet das, dass ich in meinem Value-Array die null-Referenzen durch NullObjekte ersetzen müsste, also künstliche Objekte erzeugen müsste?
Du brauchst nur ein einziges NullObjekt (statisch, aber kein GoF Singleton), soll ja keine Zustände speichern und Immutable sein, die Referenz kannst du immer wieder anstatt null verwenden.
 

samosa

Mitglied
@ANDI_CH

Das ist richtig, die statische Methode macht das gleiche wie die null-Abfrage plus gleichnamige Membermethode.

Der Unterschied aber ist, dass ich bei Verwendung der statischen Abfrage nicht mehr null-Abfragen hinschreiben muss, weil diese bereits in der statischen Methode steckt.

Du musst Dir vorstellen, dass ich haufenweise Operationen auf Matrizen schreibe und jedesmal diese lästige null-Abfrage einbauen muss.
 

Andi_CH

Top Contributor
Noch zum Abschluss - es dauerte halt einige Minuten:

Java:
public class TestNull {

	private static class Value {
		public String toString() {
			return "Ich bin echt";
		}
	}

	private static class NullValue extends Value {
		public String toString() {
			return "Ich bin leer";
		}
	}

	private Value[] arr;

	private TestNull() {
		arr = new Value[5];
		Value nullValue = new NullValue();
		for(int i=0; i<arr.length; i++) {
			arr[i] = nullValue;
		}
	}
	
	private void add(Value v,int pos) {
		arr[pos] = v;
	}

	public void print() {
		for(int i=0; i<arr.length; i++)
			System.out.println(""+arr[i]);
	}

	public static void main(String[] args) {
		TestNull tn = new TestNull();
		tn.add(new Value(), 3);
		tn.print();
	}
}
 

samosa

Mitglied
@ANDI_CH

Danke für das anschauliche Beispiel.

Das Design mit dem NullObjekt sieht elegant aus. Einziger Wermutstropfen, ich muss die ganze Matrix durchlaufen und erst mal alles mit NullObjekten füllen. Wenn man 1000de solcher Matrizen moderater Größe hat, könnte das dauern.
 

Marco13

Top Contributor
Die Strutktur der Matrix ist mir nicht ganz klar, hab's aber auch nicht konzetriert gelesen (eine dünn besetzte Matrix, deren Elemente 3D(!)-double-arrays sind?! Klingt schräg).
Das mit den NullObjects ist zwar oft eine elegante Lösung (Collections#emptyList usw. wurden schon genannt) aber wenn es da um was zeitkritisches (und bei dünn besetzen Matrizen vermutlich auch Speicherkritisches) geht, macht das ja keinen Sinn: So eine Matrix liefert doch normalerweise automatisch 0 (oder eben null) an den nicht besetzten Stellen, und wenn man die mit Null-Objekten auffüllt, ist sie nicht mehr Sparse ... Worum geht's eigentlich: Um die "Effizienz" der if(null)-Abfrage, oder um die Ästhetik?
 

samosa

Mitglied
@marco

die matrix besteht aus elementen, die dünn besetzte vektoren sind. die matrix selbst kann je nach anwendung sparse sein, muss es aber nicht. deswegen ist das nullobjekt in manchen fällen, so wie du sagst, zwar elegant aber störend.

mir geht es um die ästhetik aber auch um die lästige schreibarbeit. ich will die null-Abfrage möglichst elegant loswerden.
 
D

Dow Jones

Gast
So eine Matrix liefert doch normalerweise automatisch 0 (oder eben null) an den nicht besetzten Stellen, und wenn man die mit Null-Objekten auffüllt, ist sie nicht mehr Sparse ...
Ich muss zwar zugeben das ich die konkrete Anwendung hier auch nicht wirklich nachvollzogen habe, aber spricht denn etwas dagegen das die spärlich besetzte Matrix/Vektor statt 0 (oder eben null) das Nullobjekt zurückliefert? Dazu müsste man die Matrix doch nicht mit Nullobjekten auffüllen; genausowenig wie man sie ansonsten vorher mit 0/null auffüllt.
Übersehe ich da etwas? :bahnhof:
 
M

maki

Gast
Nachdem ich mir Marcos Post durchgelesen ahbe, sehe ich ein warum er immer sagt dass OOAD nicht unbedingt für jedes Mathematische Problem geeignet ist...

Nachdem erstellen des Arrays wäre erstmal alles mit null vorbelegt... man müsste dann im Nachhinein die verbliebenen null Elemente durch das NullObject austauschen....

Wäre es eigentlich auch eine Option in der add Methode auf null zu prüfen? ;)
 

samosa

Mitglied
@Dow Jones

Ich versuche das Problem weiter zu vereinfachen. Angenommen wir haben folgende Datenstruktur
Code:
String[][] tabelle
. In einer Anwendung sollen tausende Tabellen verarbeitet werden. Dabei kommt es vor, dass man elementweise Operationen auf die Einträge der String-Matrix durchführen muss (z.B append(), equals(), substring()). Man müsste dann jedesmal überprüfen, ob der Tabelleneintrag keine Nullreferenz ist. Das sieht nicht nur eklig aus sondern ist auch Schreibarbeit ;-)

Der Ausweg mit NullObjekten ist elegant, bedeutet aber, dass ich alle Elemente von tausenden von Tabellen initialisieren muss. Wenn ich eine Tabelle kopiere, muss ich ebenfalls alle Elemente der Matrix durchlaufen. Es gibt noch weitere Operationen, die den Zeitaufwand aufblähen.
 

samosa

Mitglied
@Maki

Wenn die add-Methode eine Membermethode ist, erhalte ich einen Laufzeitfehler bei null-Referenzen. Deswegen die Überlegung mit statischen Methoden. Dort kann ich das dann machen und mein Problem wäre gelöst.

Meine Frage ist nun: Ist das sauber eine Klasse mit lauter statischen Methoden wie add(), mult(), usw zu schreiben, wobei die statischen Methoden die übergebenen Parameter verändern (ich will Kopien vermeiden).
 

slawaweis

Bekanntes Mitglied
NullObject's beinhalten das Problem, dass der Array/List Producer und Consumer sich auch daran halten muss. Falls das System eine Blackbox ist, muss man das NullObject nach Außen sichtbar machen oder ständig null durch NullObject und umgekehrt ersetzen, was eine weitere Fehlerquelle sein kann.

Das eleganteste an dieser Stelle ist tatsächlich if(x != null). Was die statischen Funktionen angeht, man kann es machen, aber nicht in der Datenklasse, sondern in einer Utility-Klasse, welche nur statische Funktionen enthält. Da kann man auch gleich ein paar Funktionen/Fälle mehr einfügen, damit man keinen redundanten Code im Hauptteil schreiben muss:

Java:
public class ValueUtils
{
 public static Value add(Value u, Value v) {
    if(u != null) {
        return u.add(v);
    }
    return v;
 }

 public static void add(Value [] values, Value v) {
   // ...
 }

 public static void add(List<Value> values, Value v) {
   // ...
 }

 public static List<Value> add2Copy(List<Value> values, Value v) {
   // ...
 }
}

Slawa
 

Marco13

Top Contributor
...spricht denn etwas dagegen das die spärlich besetzte Matrix/Vektor statt 0 (oder eben null) das Nullobjekt zurückliefert? Dazu müsste man die Matrix doch nicht mit Nullobjekten auffüllen; genausowenig wie man sie ansonsten vorher mit 0/null auffüllt.
Übersehe ich da etwas? :bahnhof:

Nö, das würde ggf. auch gehen, aber ... es stimmt schon: Der Kontext wäre hier wichtig, vielleicht morgen nochmal durchlesen....
 

Andi_CH

Top Contributor
@ANDI_CH

Danke für das anschauliche Beispiel.

Das Design mit dem NullObjekt sieht elegant aus. Einziger Wermutstropfen, ich muss die ganze Matrix durchlaufen und erst mal alles mit NullObjekten füllen. Wenn man 1000de solcher Matrizen moderater Größe hat, könnte das dauern.

Wenn du Millionen von Einträgen hast wirst du es vielleicht bemerken - Java ist zwar schnell aber sicher nicht die schnellste aller Sprachen. Wenn es darauf ankommt müsstest du etwas nehmen das nicht auf eine VM läuft.
Also vergiss den Wermutstropen ;-)

So nebenbei, wie messe ich möglichst präzise die Laufzeit eines Codeteiles?
Wie lange dauert es auf einem durchschnittlichen PC, einen Array mit einer Million Elementen zu setzen?

EDIT:

Konsturktor abgeändert:
Java:
	private TestNull(int length) {
		arr = new Value[length];
		Value nullValue = new NullValue();
		start = System.currentTimeMillis();
		for(int i=0; i<arr.length; i++) {
			arr[i] = nullValue;
		}
		stop = System.currentTimeMillis();
	}
und aus dem Hauptprogramm die Differenz ausgegeben.

Aus Eclipse gestartet:

Code:
Start = 1299229508764
Stop  = 1299229508858
Zeitaufwand um 100000000 Elemente zu setzen ist 94 Millisekunden
 
Zuletzt bearbeitet:
M

maki

Gast
So nebenbei, wie messe ich möglichst präzise die Laufzeit eines Codeteiles?
Mit einem Profiler, zB. VisualVM, gibt auch das TPTP Projekt von Eclipse.
Allerdings kann sich die Laufzeit eines Codeteiles rapide ändern wenn der JIT Compiler der HotSpot VM zuschlägt.
 

Andi_CH

Top Contributor
Mit einem Profiler, zB. VisualVM, gibt auch das TPTP Projekt von Eclipse.
Allerdings kann sich die Laufzeit eines Codeteiles rapide ändern wenn der JIT Compiler der HotSpot VM zuschlägt.

Hab gerade oben editiert :)

Ich glaube nicht dass der Loop der die 100'000'000 Elemente setzt durch den GC unterbrochen wird ;-)

Aber dein Einwand sollte für den TO erst recht Motivation sein, nicht über die wenigen Millisekunden Aufwand nachzudenken die das braucht :)
 

Marco13

Top Contributor
Es könnte in diesem Fall auch um den Speicher gehen. Oben war dann ja davon die Rede, die Matrix "mit NUllObjects zu füllen" - was ja keinen Sinn machen würde, wenn man davon ausgeht, dass die Matrix als CRS, CCS oder sonstwas gespeichert ist. An den nicht gefüllten Stellen automatisch ein NullObject zurückzugeben würde die null-Abfrage ja nur vom "Client" in die Matrix verschieben, deswegen die Frage, ob es da um Effizienz oder Schönheit geht.
 

Andi_CH

Top Contributor
Aehm - es geht um Arrays in denen Referenzen auf Objekte liegen und es geht darum nicht überall
Code:
if (xx[i]!=null)
hinschreiben zu müssen. (Obwohl ich das hemmungslos getan hätte, denn das "überall" beschränkte sich auf eine Methode)


EDIT:

Es gibt schon Ausreisser:
Code:
Start = 1299231621860
Stop  = 1299231621969
Zeitaufwand um 100000000 Elemente zu setzen ist 109 Millisekunden

Da ging sogar sehr kurzfristig in kleines popup auf, das ich aber nicht erkennen konnte...

EDIT:

1000 mal geloopt : die Verteilung der Zeiten:
78 Millisekunden kam 189 mal vor
79 Millisekunden kam 24 mal vor
93 Millisekunden kam 138 mal vor
94 Millisekunden kam 394 mal vor
109 Millisekunden kam 48 mal vor
110 Millisekunden kam 20 mal vor
111 Millisekunden kam 1 mal vor
125 Millisekunden kam 85 mal vor
126 Millisekunden kam 2 mal vor
140 Millisekunden kam 25 mal vor
141 Millisekunden kam 48 mal vor
156 Millisekunden kam 15 mal vor
157 Millisekunden kam 11 mal vor


und der GC kam immer mal wieder dazwischen (so nach 4 - 5 Kontruktoraufrufen und das dauerte geschätzt bis zu einer Sekunde bevor Eclipse wieder "rannte")
 

Anhänge

  • SystemauslastungNullTest.png
    SystemauslastungNullTest.png
    27,4 KB · Aufrufe: 30
Zuletzt bearbeitet:

slawaweis

Bekanntes Mitglied
ich habe den Benchmark auf einem Atom Z520 laufen lassen, mit -Xms512m -Xmx1024m:

Java:
        for(int i=0; i<arr.length; i++) {
            arr[i] = nullValue;
        }

Code:
Zeitaufwand um 100000000 Elemente zu setzen ist 2797 Millisekunden

Java:
        for(int i=0; i<arr.length; i++) {
           if(arr[i] == null)
            arr[i] = nullValue;
        }

Code:
Zeitaufwand um 100000000 Elemente zu setzen ist 3029 Millisekunden

kommt eben auf den Prozessor an.

Slawa
 

slawaweis

Bekanntes Mitglied
zwar dauert der gesamte Durchlauf des Programms etwas länger, aber an der gemessenen Stelle ergeben sich folgende Werte:

Code:
// ohne if(arr[i] == null)
Zeitaufwand um 100000000 Elemente zu setzen ist 875 Millisekunden

// mit if(arr[i] == null)
Zeitaufwand um 100000000 Elemente zu setzen ist 953 Millisekunden

Slawa
 

Marco13

Top Contributor
Solche Microbenchmarks sind immer heikel. Die einzige Möglichkeit, auch nur den Hauch einer Aussage da raus zu ziehen, ist mit einem Muster wie
Code:
void test()
{
    for (int size=min; size<=max; size++)
    {
        for (int run=0; run<runs; run++)
        {
            testA(size);
            testB(size);
        }
    }
}
Abwechselnd beide Tests mit Zeitmessungen (am ehesten noch mit System.nanoTime) und steigender Eingabegröße, und das ganze ein paar mal wiederholt und die Zeiten ggf. gemittelt.
 
D

Dow Jones

Gast
Aehm - es geht um Arrays in denen Referenzen auf Objekte liegen und es geht darum nicht überall
Code:
if (xx[i]!=null)
hinschreiben zu müssen. (Obwohl ich das hemmungslos getan hätte, denn das "überall" beschränkte sich auf eine Methode)
Stimmt, würde ich auch. Man muss nicht jede 10-Zeilen-Methode nach dem Lehrbuch designen, in so kleinem Rahmen kann "Spaghetticode" durchaus die beste Lösung sein.

Wobei - wenn der TE nicht gerade unter Zeitdruck steht kann er diesen Fall ja zum Anlass nehmen sich mal in AOP einzuarbeiten. Dann hätte er seine schnellen Arrays und bräuchte nicht überall if-null-Abfragen hinzuschreiben. :D
 

fastjack

Top Contributor
Wenn Ihr jetzt noch weiter über Benchmarks redet, schreibe ich auch einen ;)

Das mit dem Nullobjekt ist schon gut, allerdings muß der Nutzer das auch wissen. Wenn Deine Methode sowieso null ignoriert, warum verbietest Du es dann nicht einfach, entweder per Konvention in der Doc, oder per Prüfung in der add()-Methode und werfen einer IllegalArgumentException. Ich würde zu Ersterem raten.

Wenn ich als Programmierer null adden will, bin ich selbst schuld ;) Aber das Schlimmste, was ich erwarten würde, ist, das es schweigend weggefiltert wird, oder durch ein Nullobjekt ersetzt wird. Um das zu verhindern, baue Dir eine Klasse die das Array ersetzt.
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
zwar dauert der gesamte Durchlauf des Programms etwas länger, aber an der gemessenen Stelle ergeben sich folgende Werte:

Code:
// ohne if(arr[i] == null)
Zeitaufwand um 100000000 Elemente zu setzen ist 875 Millisekunden

// mit if(arr[i] == null)
Zeitaufwand um 100000000 Elemente zu setzen ist 953 Millisekunden

Slawa

Was hab ihr bloss für Steinzeitmaschinen? Sogar mein IBM R51 (Jahrgang nicht mehr bekannt) schaffte es in knapp über 100mS
 

Dit_

Bekanntes Mitglied
Ich hab mal gelern, dass bei Berechnung von Aufwand die if-Abfragen nicht berücksichtigt werden, da diese so gut wie "nichts kosten" ( ein Prozessortakt? ).

Ich würde lieber so lassen wie es ist, es ist sicher und hat fast keine Geschwindigkeitsnachteile. Selbst wenn ich zu 100% sicher bin, ich werde nie "null" übergeben, überpruefe ist trotzdem auf "null". Code wird zwar länger, aber es ist eine gute Gewohnheit, die bei sehr großen Projekte mit vielen Abhängigkeiten viel Ärger einspart.

Außerdem kann du immer noch

Java:
else {
System.err.println("dies haette nicht passieren dürfen: val ist null");
//oder
//Logger.....

hinzufuegen, hilft auch manchmal
 

tfa

Top Contributor
Selbst wenn ich zu 100% sicher bin, ich werde nie "null" übergeben, überpruefe ist trotzdem auf "null". Code wird zwar länger, aber es ist eine gute Gewohnheit, die bei sehr großen Projekte mit vielen Abhängigkeiten viel Ärger einspart.
Warum? So behinderst du nur die Fehlersuche, wenn das Objekt trotz allem doch mal null wird. Wenn gleich eine NullpointerException fliegt, kann man die leicht an der richtigen Stelle ausfindig machen und beheben. Wenn du den Fehler verschleppst, tritt er vielleicht erst Stunden oder Tage später als falsch berechneter Wert in der Datenbank hervor. Das macht Ärger.
 

Dit_

Bekanntes Mitglied
ich meine nur, dass ich immer einen Fehler erwarte und die Behandlung sofort (im else oder catch-block) implementiere ohne zu warten, dass der Fehler irgendwann auftritt, try-catch oder if-else ist ja egal. Ich gehe nur immer davon aus dass es zu Fehler kommt.

Ich ich es ist beser als eine "BitteKeinNullÜbergebenKonvention" :)

gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Interface als Instanzvariable = gutes Design Java Basics - Anfänger-Themen 6
G Bei Mouseover Grafik ändern, gutes Vorgehen gesucht Java Basics - Anfänger-Themen 0
X Best Practice SUCHE ein gutes Javabuch! (kein Anfang von 0) Java Basics - Anfänger-Themen 5
K Gutes Java 3D Game Tutorial gesucht Java Basics - Anfänger-Themen 6
M Gutes Beispiel für Exception- werfende & behandelnde Methode Java Basics - Anfänger-Themen 5
D Gutes Beispielprogramm für Threads? Java Basics - Anfänger-Themen 3
D Suche gutes Buch oder Tutorial Java Basics - Anfänger-Themen 3
J Gutes Buch für Anfänger Java Basics - Anfänger-Themen 11
G gutes Reporting Tool welches mit Java zusammenarbeitet Java Basics - Anfänger-Themen 8
N Java lernen / Gutes Buch Java Basics - Anfänger-Themen 9
K Kennt jemand ein gutes Tutorial für Wertübergabe? Java Basics - Anfänger-Themen 4
G gutes Tutorial rund um WAR-Dateien Java Basics - Anfänger-Themen 4
G Suche gutes DB-Forum Java Basics - Anfänger-Themen 11
S Gutes Beispiel für Vererbung? Java Basics - Anfänger-Themen 14
K gutes Tutorial? Java Basics - Anfänger-Themen 4
N kennt ihr ein gutes java forum für anfänger? Java Basics - Anfänger-Themen 5
M Gutes einsteiger Buch? Java Basics - Anfänger-Themen 2
C gutes Java-Programm Java Basics - Anfänger-Themen 5
J Compiler + Gutes Buch Java Basics - Anfänger-Themen 2
F kostenloses, gutes UML Tool zum rumprobieren Java Basics - Anfänger-Themen 7
D was ist der vorteil vom Builder-design pattern? Java Basics - Anfänger-Themen 11
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
A Frage zum UML Design Java Basics - Anfänger-Themen 1
F Design pattern Java Basics - Anfänger-Themen 29
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
N design time vs build time vs compile time Java Basics - Anfänger-Themen 2
H Eclipse , Design-Modus, unvollständige Darstellung Java Basics - Anfänger-Themen 0
M LookandFeel Design Java Basics - Anfänger-Themen 4
D Design Pattern Command Java Basics - Anfänger-Themen 3
M Erste Schritte Eclipse + design view Java Basics - Anfänger-Themen 3
J Design Patterns Java Basics - Anfänger-Themen 8
Tarrew Proxy Design-Pattern Java Basics - Anfänger-Themen 1
D Besseres Design Frage Java Basics - Anfänger-Themen 1
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
J MVC- Design Frage Java Basics - Anfänger-Themen 3
C Java Klassen Design? Java Basics - Anfänger-Themen 5
OnDemand Software-Design Java Basics - Anfänger-Themen 1
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
B Warum haben Java Programme ein anderes Design? Java Basics - Anfänger-Themen 5
S Singleton (Design Patterns) Java Basics - Anfänger-Themen 16
A Design Pattern - Welche? Java Basics - Anfänger-Themen 33
Rudolf OOP Übungen zu Design Pattern in Java Java Basics - Anfänger-Themen 6
S Eclipse Design-Reiter fehlt Java Basics - Anfänger-Themen 6
D Design-Tipps für neues Programm (Excel-Charts-...) Java Basics - Anfänger-Themen 3
M Button mit eigenem Design Java Basics - Anfänger-Themen 6
R Welches Design pattern Java Basics - Anfänger-Themen 10
X Externer GUI Code verwenden / (Design Ansicht) Java Basics - Anfänger-Themen 3
B OOP Frage zu Klassen Design Java Basics - Anfänger-Themen 5
Hamstinator Design und Listener in verschiedenen Klassen Java Basics - Anfänger-Themen 6
J Methoden design Java Basics - Anfänger-Themen 3
hdi Design-Problem Java Basics - Anfänger-Themen 2
hdi Kleine Design/Convention Frage zu Konstruktoren Java Basics - Anfänger-Themen 4
Q Listen - DefaultListModel trotz Design ueber GUI? Java Basics - Anfänger-Themen 10
B Java-Anwendung im Windows Design Java Basics - Anfänger-Themen 8
hdi Design-Frage: bin unzufrieden Java Basics - Anfänger-Themen 11
M code design Java Basics - Anfänger-Themen 14
M log4j design Java Basics - Anfänger-Themen 11
D Design Fragen Java Basics - Anfänger-Themen 5
M Design: Abfrage auf korrekte Eingabe Java Basics - Anfänger-Themen 4
W Design Problem Java Basics - Anfänger-Themen 7
T Wie wichtig ist Design Patterns in einer Firma? Java Basics - Anfänger-Themen 8
M Java Design Frage Java Basics - Anfänger-Themen 2
S log4j "Richtiges" Design Java Basics - Anfänger-Themen 4
D JButton - Design ändern Java Basics - Anfänger-Themen 8
S Frage zum Design der Vererbung (Kartendeck und Dupletten) Java Basics - Anfänger-Themen 12
S Design Frage Java Basics - Anfänger-Themen 5
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
Junger_Basileus Celsius -> Fahrenheit / Strukturierung in statischen Methoden Java Basics - Anfänger-Themen 7
D Aufruf einer statischen Variable Java Basics - Anfänger-Themen 1
K Compiler-Fehler Objektmethode aus einer statischen Methode heraus aufrufen Java Basics - Anfänger-Themen 34
K Welchen Typ haben Variablen in Default-Methoden und in statischen Methoden in Schnittstellen? Java Basics - Anfänger-Themen 4
Shams Synchronized-Schlüsselwort bei Inkrementierung einer statischen Variable Java Basics - Anfänger-Themen 13
A Nicht-statische Methode in einer statischen aufrufen Java Basics - Anfänger-Themen 10
T Dynamisches abarbeiten von statischen Methode aus verschiedenen Klassen. Java Basics - Anfänger-Themen 5
A Klassennamen im statischen Umfeld Java Basics - Anfänger-Themen 14
N OOP Zugriff auf eine Objekt innerhalb einer Klasse aus statischen Methoden Java Basics - Anfänger-Themen 9
A Parameterübergabe zwischen statischen und nicht statischen Klassen Java Basics - Anfänger-Themen 6
hdi Lebensspanne von statischen Variablen Java Basics - Anfänger-Themen 7
A non-static Methode ausführen in statischen Kontext Java Basics - Anfänger-Themen 17
R Properties über statischen Pfad laden Java Basics - Anfänger-Themen 2
G Warum hat Java keinen statischen Konstruktor? Java Basics - Anfänger-Themen 5
G Problem mit nicht statischen Funktionen Java Basics - Anfänger-Themen 7
S Ergebnisse aus statischen Methoden weiterverwenden Java Basics - Anfänger-Themen 5
M Problem mit nicht statischen Methoden Java Basics - Anfänger-Themen 6
F Verwendung von this in statischen Kontext nicht möglich Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben