Zugriff auf Methodenergebnisse?

TomHH

Mitglied
Hallo zusammen

Ich habe ein Problem, das ich nicht verstehe:

Ich habe eine Methode, deren Ergebnis über die Methode unten ("void ausgabe") abgefragt wird: (alle Variablen wurden zuvor richtig initialisiert und definiert):

Code:
 void toReverse(){
      char[] reverse = eingabe.toCharArray();
      char[] rev = new char [reverse.length];
      for(int i = reverse.length-1; i >= 0; i-- ){
      rev[j] = reverse[i];
      reve = rev[j];
      j++;
      strnew += reve;
      }//for
   }

Ausgabe-Methode:
Code:
void ausgabe(){
   System.out.println("In Großbuchstaben: " + resultup);
   System.out.println("In Kleinbuchstaben: " + resultlow);
   System.out.println("Der String rückwärts geschrieben: " + strnew);
   System.out.println("Der Buchstabe an der dritten Stelle ist: " + toSplit());
   //System.out.println("Der Buchstabe in der Mitte ist: " + mitte);
   }
}

so weit, so klar...
Wenn ich nun allerdings die gleiche Methode für diese Methode hier unten verwenden will, dann bekomme ich kein Ergebnis angezeigt bzw nur ein leeres Kästchen:

Code:
char toSplit(){
      char[] split = eingabe.toCharArray();
      return split[2];
   }

Deshalb lautet der Aufruf:
Code:
System.out.println("Der Buchstabe an der dritten Stelle ist: " + toSplit());

Ich dachte jedoch, ich könnte die Methode so schreiben, dass ich eine VOID-Methode habe (wie oben auch) und dann per Variable das Ergebnis abfragen, also ungefähr so:
Code:
 void toSplit(){
      char[] split = eingabe.toCharArray();
      splitback = split[2];
   }
Splitback würde ich dann per ausgabe() mir anzeigen lassen...

Ich verstehe nun also nicht, warum ich es so nicht machen kann?
Könnte mir da jemand vielleicht bitte eine Erklärung geben?

Vielen Dank!

Tom ;-)
 
aber du weist ja, globale Variablen sind böse! Naja, eigentlich nur schlechtes Design - es geht eigentlich immer ohne.
 
Beispiel:


Code:
class globVars {
   public static int globalInt=0;
   public static double globalDouble=0;
   public static String globalString="Dies ist eine globale Variable - 
               jeder Depp kann sie ändern und meine Berechnungen damit 
              durcheinander bringen sowie meine Klasse in einen
              inkonsistenten Zustand bringen";
 
Original geschrieben von squeaker
Beispiel:


Code:
class globVars {
   public static int globalInt=0;
   public static double globalDouble=0;
   public static String globalString="Dies ist eine globale Variable - 
               jeder Depp kann sie ändern und meine Berechnungen damit 
              durcheinander bringen sowie meine Klasse in einen
              inkonsistenten Zustand bringen";

OK.
Ich gehe davon aus (zumindest hoffe ich das ;)), dass Dario

Code:
class MyClass
{
  private char splitback;
...
}

meinte, denn das genügt völlig aus.
Ansonsten hast Du Recht, public static Variablen sind pfui, wenn sie nicht gerade als globale Konstanten verwendet werden. Wobei man Konstanten auch in ein Interface legen kann...
 
TomHH:
Was du willst, würde ich niemals wollen.

Eine Methode ist dazu da genau eine Aktion auszuführen und das Ergebnis als Rückgabewert
zu liefern.
Wenn ich eine Methode schreibe, welche Werte verändert aber keine Rückgabe hat, dann überlege
ich mir was ich falsch gemacht habe, und wie ich das Designtechnisch ändern kann.

@ Dario: Es gibt keine globale Variable, und mann sollte auch nicht eine Membervariable so nennen.
Denn sie ist nicht global, selbst wenn es eine public Membervariable wäre, so wäre sie immer noch nicht global.

Auch würde eine Membervariable hier wirklich nicht zum Code passen. Definiere die Methoden so
das du einen Wert übergibst und den geänderten Wert als Rückgabe hast, alles andere ist
Unsinn:

demnach:
Code:
 void toSplit(){
      char[] split = eingabe.toCharArray();
      splitback = split[2];
   }

würde ich umändern in:

Code:
private char charAt(String string, int index) {
     return eingabe.toCharArray()[index];
}

aufruf:
    System.out.println("Der Buchstabe an der dritten Stelle ist: " + charAt(string,2) );

Ich habe die Methode umbenannt in charAt, denn toSplit ist als Name unbrauchbar
da die Methode nicht eine gesplitteten String zurückgibt. Sondern sie findet heraus
welcher Char an Position n ist. Da passt charAt besser, wie gut zeige ich ganz unten
auf ;)

Dein Code sollte auch nicht eine Membervariable (in deinem Beispiel eingabe) als
zu bearbeitenden String nehmen. Du legst dich sonst fest das eine Klasse die diese
Methode definiert immer eine Membervariable mit genau diesem Bezeichner hat, was
nicht gerade zu wiederverwendbaren Code führt.


Apropos wiederverwendbarer Code, du brauchst diese Methode nicht schreiben denn
sie existiert schon, und auch dort wird die Methode charAt genannt:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html

Code:
charAt

public char charAt(int index)

    Returns the character at the specified index. An index ranges from 0 to length() - 1. The first character of the sequence is at index 0, the next at index 1, and so on, as for array indexing.

    Specified by:
        charAt in interface CharSequence

    Parameters:
        index - the index of the character. 
    Returns:
        the character at the specified index of this string. The first character is at index 0. 
    Throws:
        IndexOutOfBoundsException - if the index argument is negative or not less than the length of this string.

Demnach kannst du die Methode ganz fallen lassen und folgendermassen das durchführen:

Code:
public void ausgabe(){
   .....
   System.out.println("Der Buchstabe an der dritten Stelle ist: " + eingabe.charAt(2));
    ....
}

Noch ein Tip:
Du solltest grundsätzlich die Zugriffsrechte der Methode bestimmen. Sprich dir angewöhnen private Methoden wirklich private zu deklarieren.
 
public static String globalString="Dies ist eine globale Variable -
jeder Depp kann sie ändern und meine Berechnungen damit
durcheinander bringen sowie meine Klasse in einen
inkonsistenten Zustand bringen";

Negativ, es ist keine Globale Variable, es ist eine öffentliche Klassenvariable. Das sie allgemein erreichbar ist, heisst noch lange nicht das es eine Globale Variable ist.

Globale Variablen haben ihre eigene ganz eindeutige definition.
 
Globale Variablen sind Variablen die von überall aus erreichbar sind und änderbar sind.

public static sind zwar nicht im strengen Sinn globale Variablen, aber sie verhalten sich wie globale Variablen. Sie haben die selben schlechten Eigenschaften. Damit sind sie quasi synonym zu betrachten.
 

Neue Beiträge

Zurück