Wort als Int funktioniert nicht

Status
Nicht offen für weitere Antworten.

materthron

Mitglied
Hi!
Hab folgenden Code:

Code:
    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;
    }

Wenn ich aber jetzt aufrufe
Code:
bmi.getBMIinKG( 75, 171, MALE )
, dann funkt des ned.


Warum?

Wie immer hoherfreut über jedwedige Antwort.


:!:
Für den ders gemerkt hat: dieser Code gehört auch zum if oder verschiedene getter-Thema.

Das Programm kann dann und wann auf der Website BMICalc.sf.net heruntergeladen werden.
 
Is
Code:
public final boolean MALE = true;
public final boolean FEMALE = false;

ned irgendwie sexistisch?

😀
 
Code:
public final String FEMALE = "Kueche";

wäre sexistisch...😉
 
Reality hat gesagt.:
Code:
public double getBMIinKG(double weight, double heigth, String sex)

Liebe Grüße
Reality

Warum...Das braucht nur sinnlos Speicher, und bei den Vergelcihen auch noch mehr Rechenzeit...
 
meez hat gesagt.:
Reality hat gesagt.:
Code:
public double getBMIinKG(double weight, double heigth, String sex)

Liebe Grüße
Reality

Warum...Das braucht nur sinnlos Speicher, und bei den Vergelcihen auch noch mehr Rechenzeit...
Hatte ich ganz vergessen! :shock:

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! 😛

Liebe Grüße
Reality
 
Man könnte auch einen eigenen Typ entwerfen: 😀

Code:
public class Gender {

    public final static Gender MALE = new Gender();
    public final static Gender FEMALE = new Gender();

    private Gender(){}
}
 
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).

Liebe Grüße
Reality
 
Du hast eine eigene Klasse und kein eigenen Typ entworfen.

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).

Wie eigene Klasse, er hat doch int-Konstanten definiert. ???:L
 
Das was er da macht ist schon OK...Eigene Klassen sind sinnlos...
MALE und FEMALE sollen ja Felder sein...
 
Eigene Klassen sind sinnlos...
MALE und FEMALE sollen ja Felder sein...

Diese Klasse ist doch quasi ein Feld. Statt:

Code:
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;
}
 
akira hat gesagt.:
Ausserdem hat materthron schon eine eigene Klasse entworfen (aber eben nicht für jede zweite Variable).

Wie eigene Klasse, er hat doch int-Konstanten definiert. ???:L

In diesem Punkt gebe ich dir Recht, dass ich mich versehen hab und man nicht rauslesen kann, ob er eine eigene Klasse entworfen hat.

Liebe Grüße
Reality
 
akira hat gesagt.:
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;
}

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.

Liebe Grüße
Reality
 
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.

1. Doch, bissle Speicher brauchen sie, ich glaub 4 byte oder so braucht jede Instanz.

2. Doch, gibt es, Java 1.5:
Code:
enum Genders{
    male,
    female
}
Code:
public double getBMIinKG(double weight, double heigth, Genders sex) { 
        if (sex == Genders.MALE) { 
            //Mann-Code 
        } 
        else{
            //Frau-Code 
        } 
        return bmi; 
}
und dann aufrufen:
Code:
double d = getBMIinKG (65., 1.8, Genders.male);
:bae:

@Reality Doch das stimmt so, und kommt auch oft in der API vor.
Durch den privaten Konstruktor gibt es nämlich nur die zwei Instanzen der Klasse.
 
Doch, bissle Speicher brauchen sie, ich glaub 4 byte oder so braucht jede Instanz.

Ok, es werden 8 Byte statischer Speicher verbraucht, jedoch kein Platz auf dem Heap.

Ausserdem vergleichst du die Inhalte der Objekte mit == , was bei Objekten nicht geht
.

Wieso kann ich Objekte nicht mit == vergleichen?

Und wegen 2 Variablen legt man normalerweise keine Klasse an.

Ok, in diesem Falle würde auch ein boolean genügen, aber ab 3 Werten macht so ein Pattern durchaus Sinn.
 
akira hat gesagt.:
Ausserdem vergleichst du die Inhalte der Objekte mit == , was bei Objekten nicht geht
.

Wieso kann ich Objekte nicht mit == vergleichen?

@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:
 
Hi,
Beni hat gesagt.:
@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.

@Illuvatar:
Danke für den Link! 🙂

Liebe Grüße
Reality
 
Code:
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.
 
Ach stimmt, deine Objekte sind ja static. Das mit dem private wusste ich nicht...

Liebe Grüße
Reality
 
Hi,

akira hat gesagt.:
Doch, bissle Speicher brauchen sie, ich glaub 4 byte oder so braucht jede Instanz.

Ok, es werden 8 Byte statischer Speicher verbraucht, jedoch kein Platz auf dem Heap.

typsichere Enums haben diverse Vorteile, aber mit Sicherheit nicht im Bezug auf Speicherplatz.

Es muss ja erst einmal die komplette Klasse geladen werden, und das alleine kann schon ein paar KByte kosten. Je nach JVM.

Gruß Jaraz
 
typsichere Enums haben diverse Vorteile, aber mit Sicherheit nicht im Bezug auf Speicherplatz.

Es muss ja erst einmal die komplette Klasse geladen werden, und das alleine kann schon ein paar KByte kosten. Je nach JVM.

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.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben