Java Eigene Klasse wie Boolean benutzen

Kampfgnom

Lt. Commander
Registriert
Jan. 2005
Beiträge
1.075
Hi Leute,

einfache Frage: Ich habe eine eigene Klasse, die Rückgabewerte repräsentiert.

Nun würde ich sehr gerne Dinge schreiben können wie:

Code:
ReturnValue val = someFunction();
if(val) {
...
}

java.lang.Boolean ist final, kann also nicht geerbt werden. Ist so etwas möglich?

Selbstverständlich weiß ich auch selber, wie ich das "Problem" "umgehen" kann. Wollte nur interessehalber mal nachgefragt haben.

mfg Kampfgnom
 
würde mich auch mal interessieren so als anfänger;)


relevant_to_my_interests1.jpg
 
Nein, also jedenfalls nicht wenn du schreibst if(meinObject), weil ein if einen boolschen Wert erwartet.
 
1.) Ich halte von dem if(value) sowieso nicht viel.

In meinen Programmen wird man folgendes nie finden:

if(InputOK)
{
//Do something
}

Stattdessen sieht das so aus:
If(InputOK==True)
{
//Do someting
}

Nur Variablen, deren Name ein Is, Has etc. enthält, wird direkt verwendet:
If(InputIsOK)
{
//Do something
}

Eine komplette Unart ist meiner Meinung nach der alte C Stil, dass man, um 2 Zeichen zu sparen gleich nur mehr if(!value) statt if(value==0)verwendet.

2.) Darf ich fragen, warum du einen ReturnValue haben willst, der nur True oder False speichert? Wieso kann das nicht ein einfacher Boolean sein?
 
andr_gin schrieb:
1.) Ich halte von dem if(value) sowieso nicht viel.

...

Stattdessen sieht das so aus:
If(InputOK==True)


Bei der ==0 Sache gebe ich dir völlig Recht, aber das zitierte gilt trotzdem als schlechter Stil und macht man in der Regel auch nicht so. Davon abgesehen ist es fragwürdig, nur aufgrund der Bennenung von Variablen gleich eine andere Programmstruktur zu wählen (isOk vs OK).
 
Schreibe doch einfach eine eigene Methode, die einen boolean zurückgibt:

public boolean meineMethode (int parameter1) {
if (parameter1 == 11) {
//...
return true;
}
else {
//...
return false;
}
}

Fertsch.
 
Genauso wie psycho13 es schreibt macht man das auch.

Denn bei der anderen Version gibt es was wichtiges zu beachten:

Code:
if(val)

Wenn val hier nicht boolean false ist, dann ist es automatisch true. Somit würde diese Bedingung immer greifen, ausser val existiert nicht.
 
2.) Darf ich fragen, warum du einen ReturnValue haben willst, der nur True oder False speichert? Wieso kann das nicht ein einfacher Boolean sein?

Ich muss manchmal mehrere Dinge zugleich zurückgeben. z.B. einen String und Gleichzeitig ein File. Das lässt sich nunmal recht einfach über solche Klasse lösen.
Außerdem können dann FileReturnValue zugleich auch BooleanReturnValue sein, sodass ich z.B. von einem FileChooser zurückgeben kann, welche Datei ausgewählt wurde, aber zugleich auch, dass sie nicht gespeichert werden soll.
So kann ich mir die zuletzt gewählte Datei merken und beim nächsten Speichern Dialog direkt wieder eintragen.

Jetzt ist es halt folgendes:

Code:
    	FileReturnValue result = Main.getUserInterface().showNewFileDialog();
    	
    	if(!result.booleanValue()) { //the user did not enter a filename (e.g. clicked cancel)
    		LOG.trace("User did not enter a new filename. Aborting.");
    		return null;
    	}
    	
    	File filename = result.fileValue();
    	
    	Main.setLastChosenDir(filename.getParentFile());
 
lalas schrieb:
Wenn val hier nicht boolean false ist, dann ist es automatisch true. Somit würde diese Bedingung immer greifen, ausser val existiert nicht.
Ahem, bitte nochmal? :freak: Wenn val nicht false ist, dann ist es true. Ja richtig, und? Wo liegt das Problem?


@Psycho13
Das ist schlechter Programmierstil. Man sollte eher schreiben:
Code:
return parameter1 == 11;
 
SheepShaver schrieb:
@Psycho13
Das ist schlechter Programmierstil. Man sollte eher schreiben:
Code:
return parameter1 == 11;

Macht nicht wirklich viel Sinn, oder ?
Wenn die Methode einen bool als return erwartet, einen int zurückgeben?

Edit: Meine Aussage oben macht nicht wirklich Sinn..
@SheepShaver - Ja stimmt..
 
Zuletzt bearbeitet:
Es wird das Ergebnis des boolschen Vergleichs zurückgegeben, kein int.
 
Das Problem ist, das jeglich nicht-native Datentypen im Hintergrund nur zeiger auf das Objekt im Speicher sind. außer in gewissen Zuständen (Null, Nothing) Zeigen die auf einen Speicherbereich, dessen Struktur von der Klasse selbst definiert wird.

In C/C++ könnte man eventuell soetwas noch erzeugen, indem man eine Klasse so anlegt, dass das Erste byte der Klasse genau dieser Wert ist, den das Objekt repräsentiern soll, allerdings halt ich das auch da für sehr gefährlich. Da man in Java nie direkt mit Zeigern in Berührung kommt, würde ich behaupten, dass das nicht möglicht ist.

sogar ein
Code:
if( obj == true )
{
//...
}

Ist in Java auch nicht möglich, da man keine Operatoren überladen kann. In C/C++ ginge das wiederum sehr gut.
 
SheepShaver schrieb:
Ahem, bitte nochmal? :freak: Wenn val nicht false ist, dann ist es true. Ja richtig, und? Wo liegt das Problem?

Was ich damit sagen wollte ist, dass ich mit die if-Abfrage sparen kann, wenn die Bedingung sowieso immer true ist.
Beispiel:
Code:
int x = 5;

if (x) {
   ...
}

else {
   ...
}

In dem Fall würde es niemals zu else kommen, dass meinte ich damit nur.

Also stimmt schon die Aussage von Psycho13, dass man durchaus bool als Rückgabewert einer selbstgeschriebenen Funktion verwenden kann.
 
Dein Beispiel wäre unter Java garnicht realisierbar, da der Compiler in der if-Abfrage nur boolsche Ausdrücke zulässt.
 
carom schrieb:
Bei der ==0 Sache gebe ich dir völlig Recht, aber das zitierte gilt trotzdem als schlechter Stil und macht man in der Regel auch nicht so. Davon abgesehen ist es fragwürdig, nur aufgrund der Bennenung von Variablen gleich eine andere Programmstruktur zu wählen (isOk vs OK).

Es wird nicht die Programmstruktur geändert, sondern nur ein ==True angehängt zur besseren Lesbarkeit. Falls die Variable schon mit Is oder Has anfängt, so ist das unnötig, da schon aus dem Namen hervor geht, dass es sich um einen Boolean handelt.
Microsoft hat für .NET eine kleine Hilfe mit Designrichtlinien für Bibliotheken verwendet, wo auch die Namensgebung hineinspielt. Dort sind einige wichtige Punkte drin, die man für seine Programme übernehmen kann (muss nicht nur .NET sein, geht für Java genauso). Man muss nicht alles exakt befolgen, aber manche Dinge sind für saubere Programmierung absolut notwendig z.B. dass man bei Properties im Getter keine Schreibzugriffe macht:

http://msdn.microsoft.com/en-us/library/ms229042.aspx


Kampfgnom schrieb:
Ich muss manchmal mehrere Dinge zugleich zurückgeben. z.B. einen String und Gleichzeitig ein File. Das lässt sich nunmal recht einfach über solche Klasse lösen.
Außerdem können dann FileReturnValue zugleich auch BooleanReturnValue sein, sodass ich z.B. von einem FileChooser zurückgeben kann, welche Datei ausgewählt wurde, aber zugleich auch, dass sie nicht gespeichert werden soll.
So kann ich mir die zuletzt gewählte Datei merken und beim nächsten Speichern Dialog direkt wieder eintragen.

Ich glaube da gehst du überhaupt in eine falsche Richtung. Es hat schon seinen Sinn, dass man nur einen Wert zurückgeben kann. Eine Klasse hat immer einen Zweck und ist nicht nur eine Ansammlung wilder Werte. Wenn du mehr als einen Wert zurückgeben willst, dann musst du das anders lösen.
Microsoft hat das mit den FileDialogen so gelöst, dass alle Dialog (Basisklasse) einen Rückgabewert zurückliefern, nämlich OK, Cancel etc.
Die ausgewählte Datei kann dann je nach Dialog über die Properties erfolgen z.B. mit FileDialog.FileName. In deinem Fall würde kein String zurückgegeben werden, sondern in deiner Klasse als Klassenvariable gesetzt werden. Alle diese Variablen haben dann einen sprechenden Namen. Ein Außenstehender hat keine Ahnung, welche Bedeutung "BooleanValue" haben soll.

Jetzt ist es halt folgendes:

Code:
    	FileReturnValue result = Main.getUserInterface().showNewFileDialog();
    	
    	if(!result.booleanValue()) { //the user did not enter a filename (e.g. clicked cancel)
    		LOG.trace("User did not enter a new filename. Aborting.");
    		return null;
    	}
    	
    	File filename = result.fileValue();
    	
    	Main.setLastChosenDir(filename.getParentFile());

SheepShaver schrieb:
Es wird das Ergebnis des boolschen Vergleichs zurückgegeben, kein int.

Klar wird das richtige zurück gegeben und wenn man unter Berücksichtigung aller Vorrangregeln die Zeile genau durchdenkt, wird man das auch feststellen, aber es ist nicht sofort für jeden erkennbar und stört des Lesefluss. Das zeigen die Posts oben. Ein guter Code ist keiner, der alles in einer Zeile verpackt. Mehr Code ist oft übersichtlicher, als weniger Code.

SheepShaver schrieb:
Dein Beispiel wäre unter Java garnicht realisierbar, da der Compiler in der if-Abfrage nur boolsche Ausdrücke zulässt.

Ja und das tut so gut wie jede moderne Programmiersprache. Das ist nur dieser C Unfug, dass man mit syntaktisch falschen Sachen einfach weiterarbeitet und einfach irgendetwas zurückgegeben wird, weil es für die Compilerbauer in den 70er Jahren einfach so praktisch war und sich ein paar Leute gut fühlen, wenn sie kilometerlange Normen über die Behandlung von Vorrangregeln und Syntax Sonderfällen erstellen, wie diese vom Compiler zu behandeln sind, die ein geistig gesunder Mensch sowieso nie ernsthaft verwenden würde (Stichwort i++ vs. ++i).
Ein Boolean ist entweder wahr oder falsch, aber nicht 0,1,-1, der Pointer auf irgendeinen Speicherbereich etc. Wie das intern gespeichert wird, ist völlig irrelevant.
 
andr_gin schrieb:
Klar wird das richtige zurück gegeben und wenn man unter Berücksichtigung aller Vorrangregeln die Zeile genau durchdenkt, wird man das auch feststellen, aber es ist nicht sofort für jeden erkennbar und stört des Lesefluss. Das zeigen die Posts oben. Ein guter Code ist keiner, der alles in einer Zeile verpackt. Mehr Code ist oft übersichtlicher, als weniger Code.
Ich denke für Java sind die Sun Code Conventions maßgebend, und die sind in der Hinsicht ziemlich eindeutig: http://java.sun.com/docs/codeconv/html/CodeConventions.doc9.html#333

10.5.2 Returning Values

Try to make the structure of your program match the intent. Example:

Code:
if (booleanExpression) {
  return true;
} else {
  return false;
}

should instead be written as

Code:
return booleanExpression;

Similarly,

Code:
if (condition) {
  return x;
}
return y;

should be written as

Code:
return (condition ? x : y);
 
Zuletzt bearbeitet:

Ähnliche Themen

D
Antworten
15
Aufrufe
26.559
Donnidonis
D
Zurück
Oben