Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
public static final int MALE = 0;
public static final int FEMALE = 1;
/** @return BMI in KG*/
public double getBMIinKG(double weight, double heigth, int sex) {
if(sex != MALE && sex != FEMALE) throw new IllegalArgumentException();
...
return bmi;
}
Mal im Ernst. Wenn noch jemand anders mitprogrammiert oder einfach nur wegen der Übersichtlichkeit, dann schreibt man in einer Zeile.
Code:
getBMIinKG(80, 1.80, "Male");
anstatt
Code:
getBMIinKG(80, 1.80);
BMI.Male = true;
Wenn man das bei jeder Variable machen würde, hat man erst mal mehr Zeilen, was unübersichtlich ist und andere Mitprogrammierer haben es schwerer.
Oder findest du es krass, dass z.B. das Wort "Male" 4 Bytes belegt?!
Vergleichen musst du übrigens so oder so, wenn du herausfinden willst, ob Male oder Female!
Du hast eine eigene Klasse und kein eigenen Typ entworfen.
Ausserdem hat materthron schon eine eigene Klasse entworfen (aber eben nicht für jede zweite Variable).
Natürlich ist es eine Klasse, eigene Typen gibt es ja in Java nicht.
Jedoch erfüllt die Klasse die Funktion eines Typs. Es können von ihr nur die zwei Instanzen MALE und FEMALE existieren, auf die man mit == testen kann.
Damit hat man eine gewisse Typsicherheit geschaffen. Außerdem verbrauchen die beiden Instanzen KEINEN Speicher, da sie keine Member haben.
Ausserdem hat materthron schon eine eigene Klasse entworfen (aber eben nicht für jede zweite Variable).
public double getBMIinKG(double weight, double heigth, int sex) {
if(sex != MALE && sex != FEMALE) throw new IllegalArgumentException();
...
return bmi;
}
würde man schreiben:
Code:
public double getBMIinKG(double weight, double heigth, Gender sex) {
//if(sex != MALE && sex != FEMALE) throw new IllegalArgumentException(); // kann es nicht geben!
...
if(sex==Gender.MALE) {
// Mann-Code
}
else { // eine andere Möglichkeit kann es nicht geben.
// Frau-Code
}
return bmi;
}
public double getBMIinKG(double weight, double heigth, Gender sex) {
//if(sex != MALE && sex != FEMALE) throw new IllegalArgumentException(); // kann es nicht geben!
...
if(sex==Gender.MALE) {
// Mann-Code
}
else { // eine andere Möglichkeit kann es nicht geben.
// Frau-Code
}
return bmi;
}
Mir fällt gerade auf, dass dein oberer Code keinen Sinn ergibt:
Code:
public class Gender {
public final static Gender MALE = new Gender();
public final static Gender FEMALE = new Gender();
private Gender(){}
}
Du hast Objekte namens MALE und FEMALE von der Klasse Gender erstellt (Dein Konstruktor ist übrigens unnötig, da er nichts macht). Das bringt dir jedoch überhaupt nichts, da du keine Variablentypen wie String, int, boolean oder ähnliches hast, die das Geschlecht definieren!. Wie kannst du also vergleichen?! Geht in deinem Fall nicht.
Ausserdem vergleichst du die Inhalte der Objekte mit == , was bei Objekten nicht geht. Das musst du mit equals machen. Und wegen 2 Variablen legt man normalerweise keine Klasse an.
Das Problem scheint gelöst zu sein, das Offtopic geht weiter... :wink: :gaen:
Akira hat gesagt.:
Natürlich ist es eine Klasse, eigene Typen gibt es ja in Java nicht.
Jedoch erfüllt die Klasse die Funktion eines Typs. Es können von ihr nur die zwei Instanzen MALE und FEMALE existieren, auf die man mit == testen kann.
Damit hat man eine gewisse Typsicherheit geschaffen. Außerdem verbrauchen die beiden Instanzen KEINEN Speicher, da sie keine Member haben.
@Reality
Das ist ja gerade der Witz der Sache: es gibt genau zwei Gender-Objekte. Sie unterscheiden sich einzig und alleine durch ihre Speicheradresse, und genau die wird mit == verglichen.
Ich finde akiras Lösung ziemlich elegant :applaus:
@Reality
Das ist ja gerade der Witz der Sache: es gibt genau zwei Gender-Objekte. Sie unterscheiden sich einzig und alleine durch ihre Speicheradresse, und genau die wird mit == verglichen.
dann müsste man, wenn ich das richtig verstehe von einer anderen Klasse ein neues GenderObjekt erstellen und dann dieses z.B. mit dem Male-Objekt referenzieren:
Code:
class A{
public static void main(String args[]){
Gender gender = new Gender().Male;
}
}
Stimmt braucht weniger Speicher und man kann so mit == vergleichen, aber bei mehreren Variablen unübersichtlich.
class A{
public static void main(String args[]){
Gender gender = new Gender().Male;
}
}
So geht das ja gerade nicht, da der Konstruktor private ist. Du brauchst auch keine neue Instanz, sondern benutzt einfach Gender.MALE. So, wie Du z.B. auch Color.black benutzt.
Ja, Du hast recht mit dem Laden, jedoch wäre die Gender-Klasse sicher nur ein paar hundert Bytes groß und muß nur einmal geladen werden. Ich meine eigentlich eher die Tatsache, daß sie keine Member hat und quasi zur "Laufzeit", also nachdem sie geladen und die beiden Meber instanziiert wurden, keinen weiteren Speicher belegt.