Klassen Getter-Setter vor neuem Klassenaufruf - wie?

babuschka

Top Contributor
Hallo liebe Java-Gemeinde!

Seit ein paar Wochen nun beschäftige ich mich begeistert mit Java. Jeden Tag gibt es etwas Neues zu lernen und natürlich auch neue, eigene Fehler über die man stolpert.
Bislang bin ich dank Büchern und Google auch gut ohne das belästigen von Foren ausgekommen, jedoch habe ich bei meinem jetzigen Problem das Gefühl, dass ich etwas elementares nicht verstanden habe... und um auf Nummer sicher zu gehen, wende ich mich hier mal an die Experten! 🙂

Zur Zeit schreibe ich ein kleines Programm für eine MySQL Datenbank (JDBC, ...) - das hat sich auch schon klasse entwickelt (auf Anfängerniveau).

Jetzt habe ich die Getter-Setter und diese Kapselungs-Geschichte angerissen und wollte das Ganze natürlich sofort umsetzen.

Bei meinem kleinen Programm muss man jedes mal, wenn man einen Menüpunkt wählt (z.B. MySQL-Command absetzen oder einen Ping) die Zugangsdaten vom Server neu eingeben - das nervt!

Da dachte ich mir, dass ich am Anfang diese Daten vom Anwender abfrage (Ip, Port, User, Passwort) und diese dann mit "get" an die einzelnen Klassen, die die Daten brauchen, übergeben kann.

Leider musste ich festellen, dass ich damit irgendwie gegen die Wand laufe... das Get-Set Gedöns darf nicht in die Methode - das hat mir der Compiler verraten.
Das Problem: Um die nächste Klasse aufzurufen, muss ich ja wieder eine Methode haben - da nach Get-Set aber keine ist, stehe ich doof da.

Ich poste einfach mal den Code der Klasse mit der ich Probleme habe - Code sagt evtl. mehr als meine Erklärung...

Java:
class Zwei {

	private String ip;
	private String port;
	private String user;
	private String password;
	
	public void zweien() {
	
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.print("IP: ");
		String ip = reader.readLine();
		
		System.out.print("PORT: ");
		String port = reader.readLine();
		
		System.out.print("USER: ");
		String user = reader.readLine();
		
		System.out.print("PASSWORD: ");
		String password = reader.readLine();
	}
		
		public String getIp() {
			return ip;
		}
		
		public void setIp(String a) {
			ip = a;
		}
		
		public String getPort() {
			return port;
		}
		
		public void setPort(String b) {
			port = b;
		}
		
		public String getUser() {
			return user;
		}
		
		public void setUser(String c) {
			user = c;
		}
		
		public String getPassword() {
			return password;
		}
		
		public void setPassword(String d) {
			password = d;
		}
		
		Menu neu = new Menu();
		neu.menuen(); 
}


Menu ist meine andere Klasse!

Und das hier ist der Compiler-Error:
Code:
C:\Users\Checkmate\Desktop>javac *.java
Zwei.java:58: error: <identifier> expected
                neu.menuen();
                          ^
1 error
 
Zuletzt bearbeitet von einem Moderator:
Bei meinem kleinen Programm muss man jedes mal, wenn man einen Menüpunkt wählt (z.B. MySQL-Command absetzen oder einen Ping) die Zugangsdaten vom Server neu eingeben - das nervt!

Da dachte ich mir, dass ich am Anfang diese Daten vom Anwender abfrage (Ip, Port, User, Passwort) und diese dann mit "get" an die einzelnen Klassen, die die Daten brauchen, übergeben kann.

Leider musste ich festellen, dass ich damit irgendwie gegen die Wand laufe... das Get-Set Gedöns darf nicht in die Methode - das hat mir der Compiler verraten.
Das Problem: Um die nächste Klasse aufzurufen, muss ich ja wieder eine Methode haben - da nach Get-Set aber keine ist, stehe ich doof da.

Hallo und willkommen im Forum,

Die gepostete Klasse sieht soweit in Ordnung aus (Klassennamen aber groß Schreiben 😉 )
EDIT: ok die letzte Zeile geht so nicht, da diese in keiner Methode benutzt wird, sondern sozusagen im leeren Raum steht, was genau willst du denn mit "neu.menuen()" bezwecken, dazu einfach mal die Klasse posten die dazu gehört.

Kannst du zum obigen Teil deiner Beschreibung mal den Code zeigen, auf den kommt es vermutlich an um Verbesserungsvorschläge oder Hilfestellugen zu geben.
 
Zuletzt bearbeitet:
Hallo und willkommen im Forum,

Die gepostete Klasse sieht soweit in Ordnung aus (Klassennamen aber groß Schreiben 😉 )
EDIT: ok die letzte Zeile geht so nicht, da diese in keiner Methode vorhanden ist ja, was genau willst du denn mit "neu.menuen()" bezwecken, dazu einfach mal die Klasse posten die dazu gehört.

Kannst du zum obigen Teil deiner Beschreibung mal den Code zeigen, auf den kommt es vermutlich an um Verbesserungsvorschläge oder Hilfestellugen zu geben.

Hi, war gerade dabei zu sagen, dass der Code doch da steht 😉

Genau das ist halt das Problem, dass das Ganze in einer Methode stehen muss hat der Compiler ja auch schon gesagt... aber wie ich das mache ist mir nicht klar.
Java:
        Menu neu = new Menu();
        neu.menuen();

Ruft die Klasse "Menu" auf und zeigt dem Anwender ein Auswahlmenü, wo er sich entscheiden kann was er machen will - hier ist der Code (nicht lachen!).

Java:
class Menu {

	String auswahl;

	void menuen() {
	
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.println("\nChoose a task by entering the desired letter.\n");
		System.out.println("(A) Database-Check");
		System.out.println("(B) Drop SQL command");
		System.out.println("(C) Exit");
		
		auswahl = reader.readLine();
		
		if(auswahl.equalsIgnoreCase("a")) {
			
		/*	Checker neu = new Checker();
			neu.checken(); */
		}
		
		if(auswahl.equalsIgnoreCase("b")) {
		
		/*	Commander neu = new Commander();
			neu.commanden(); */
		}
		
		if(auswahl.equalsIgnoreCase("c")) {

			Ping neu = new Ping();
			neu.pingen();
		}
	}
}

Nicht wundern, wenn manches irgendwie halbgar aussieht... ich bin momentan eher auf dem Learning-by-Doing Pfad 🙂

Edit: Habe ich den Klassennamen klein geschrieben? Wo das? Wahrscheinlich sehe ich den Wald vor lauter Bäumen gerade nicht... :autsch:
 
Zuletzt bearbeitet von einem Moderator:
Gut dann zeig mal noch die main-Methode .. bzw die Klasse davon, denn diese sollte den Ablauf steuern bis eben Exit eingegeben wird.

EDIT: ups @Klassenname .. war alles korrekt, hatte mich verguckt
 
Gut dann zeig mal noch die main-Methode .. bzw die Klasse davon, denn diese sollte den Ablauf steuern bis eben Exit eingegeben wird.

EDIT: ups @Klassenname .. war alles korrekt, hatte mich verguckt

Java:
public class Start {

	public static void main(String[] args) {
	
		Zwei neu = new Zwei();
		neu.zweien();
	}
}

Ich dachte mir das folgendermaßen, bzw. habe das teilweise wohl auch so gelernt:

-Die Main startet die "Zwei"
-Die Zwei ist keine Main-Methode und kann deshalb get-set verwenden, hier werden dann auch die Daten eingegeben und im Endeffekt ja auch übergeben
-Das Menü dient als Auswahl und schickt den Anwender in die jeweilige Klasse
-Die jeweilige Klasse kann per "get" auf die eingegebenen Daten zurückgreifen und muss diese nicht jedes mal neu eingeben


^--- Geht das, oder bin ich damit auf dem Weg in die Wüste?
 
es gibt mit Sicherheit viele Möglichkeiten zum Ziel zu kommen, ich sag jetzt einfach mal wie ich es machen würde mit deinen vorhandenen Klassen.

also die main-Methode/-Klasse würde bei mir den Ablauf in einer Schleife steuern, du willst ja schliesslich öfter mit dem Menu arbeiten als nur 1x.

Zunächt würde ich dann die benötigten Daten, wie du es machst, einlesen (die Klasse Zwei am Besten in etwas Bezeichnenderes umbenennen ^^). In der Klasse hast du dann deine Logindaten vorhanden.

Nun folgt eigentlich nur noch immer wieder der Aufruf des Menus. Wird ein Menupunkt gewählt so wird dieser abgearbeitet und dann landest du wieder in der Schleife, welche wieder das Menu aufruft. Bei Exit musst du dann natürlich die Schleife verlassen können.

Das Menu muss nun nach deinen Angaben immer wieder mit der Datenbank Verbindung aufnehmen, da liegt es nahe, die Logindaten dem Menu in einem Konstruktor zuzuschieben. Somit kannst du dieses Objekt was du dabei als Parameter erhältst in der Klasse Menu ablegen und hast immer Zugriff darauf.

Sicherlich kann man das noch anders gestalten vom Klassenaufbau her, aber mit deinen Mitteln müsste das auch so klappen.
 
es gibt mit Sicherheit viele Möglichkeiten zum Ziel zu kommen, ich sag jetzt einfach mal wie ich es machen würde mit deinen vorhandenen Klassen.

also die main-Methode/-Klasse würde bei mir den Ablauf in einer Schleife steuern, du willst ja schliesslich öfter mit dem Menu arbeiten als nur 1x.

Zunächt würde ich dann die benötigten Daten, wie du es machst, einlesen (die Klasse Zwei am Besten in etwas Bezeichnenderes umbenennen ^^). In der Klasse hast du dann deine Logindaten vorhanden.

Nun folgt eigentlich nur noch immer wieder der Aufruf des Menus. Wird ein Menupunkt gewählt so wird dieser abgearbeitet und dann landest du wieder in der Schleife, welche wieder das Menu aufruft. Bei Exit musst du dann natürlich die Schleife verlassen können.

Das Menu muss nun nach deinen Angaben immer wieder mit der Datenbank Verbindung aufnehmen, da liegt es nahe, die Logindaten dem Menu in einem Konstruktor zuzuschieben. Somit kannst du dieses Objekt was du dabei als Parameter erhältst in der Klasse Menu ablegen und hast immer Zugriff darauf.

Sicherlich kann man das noch anders gestalten vom Klassenaufbau her, aber mit deinen Mitteln müsste das auch so klappen.

So, oder zumindest so ähnlich habe ich mir das auch gedacht.

Aber was ist mit dem Problem, dass ich gar nicht aus "Zwei" in "Menu" komme?
Da stehe ich ehrlich gesagt gerade komplett auf dem Schlauch...
 
das sollte in etwa wie folgt gelöst werden, über Konstruktoren
Java:
public class Menu {
    
    private Zwei loginDaten;

    public Menu(Zwei loginDaten) {
        this.loginDaten = loginDaten;
    }//constructor

   // ... alles andere kann nun direkt mit loginDaten und deren gettern arbeiten

}//Menu

//in der main dann zb:

public static void main(String[] args) {
    Zwei loginDaten = new Zwei();
    loginDaten.erfasseDaten(); //statt zweien() .. ist intuitiver

    Menu menu = new Menu(loginDaten);

    //loslegen :)
}

bei meiner lösung von vorhin, wäre nur die Frage wie du die Steuerschleife ordentlich verlässt, aber das kann man später noch klären 🙂
 
das sollte in etwa wie folgt gelöst werden, über Konstruktoren
Java:
public class Menu {
    
    private Zwei loginDaten;

    public Menu(Zwei loginDaten) {
        this.loginDaten = loginDaten;
    }//constructor

   // ... alles andere kann nun direkt mit loginDaten und deren gettern arbeiten

}//Menu

//in der main dann zb:

public static void main(String[] args) {
    Zwei loginDaten = new Zwei();
    loginDaten.erfasseDaten(); //statt zweien() .. ist intuitiver

    Menu menu = new Menu(loginDaten);

    //loslegen :)
}

bei meiner lösung von vorhin, wäre nur die Frage wie du die Steuerschleife ordentlich verlässt, aber das kann man später noch klären 🙂

Also das erste Problem habe ich mit Hilfe von hartzie im IRC gelöst - jetzt muss ich halt
"Menu" eine Referenz von dem "Zwei" Objekt geben, damit er es kennt...

Hier mal die Klassen die ich bislang habe... es wird halt nur "null" ausgegeben und nicht der Wert der eigentlich in "ip" bei "Zwei" eingegeben wurde...

Java:
public class Start {

	public static void main(String[] args) throws Exception {
	
		Zwei neu = new Zwei();
		neu.zweien();
		
	}
}

Java:
import java.io.*;

public class Zwei {

	private String ip;
	
	public void zweien() throws Exception {
	
		BufferedReader myReader = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.print("IP: ");
		String ip = myReader.readLine();
		setIp(ip);
		
		Menu neu = new Menu();
		neu.menuen();
	}

		public String getIp() {
			return ip;
		}
		
		public void setIp(String a) {
			ip = a;
		}
}


Java:
public class Menu {

	void menuen() throws Exception {
		
		Zwei neu = new Zwei();
		String host = neu.getIp();
		System.out.println("Output: " + host);
	}
}
 
Zuletzt bearbeitet von einem Moderator:
na schau doch nochmal genau wie ich das gelöst hatte mit den Konstruktoren und der Parameterübergabe

du machst gerade folgendes:
- erzeugst in der Main eine Instanz von Zwei
- rufst zweien() dieser Instanz auf und setzt damit deren Werte
- in zweien erzeugst du eine Instanz von Menu und rufst menuen() auf
- in menuen erzeugst du eine neue Instanz von Zwei .. die hat rein gar nichts mit der ersten aus der Main zu tun
 
na schau doch nochmal genau wie ich das gelöst hatte mit den Konstruktoren und der Parameterübergabe

du machst gerade folgendes:
- erzeugst in der Main eine Instanz von Zwei
- rufst zweien() dieser Instanz auf und setzt damit deren Werte
- in zweien erzeugst du eine Instanz von Menu und rufst menuen() auf
- in menuen erzeugst du eine neue Instanz von Zwei .. die hat rein gar nichts mit der ersten aus der Main zu tun

Ja, das kann ich nachvollziehen - der Knackpunkt ist ja, dass ich eine neue Instanz von Zwei erzeuge und somit gar kein Wert für "ip" definiert ist.

Kann man das ohne große Umschweife lösen? Ich gebe zu, dass ich bei Referenzierung nicht firm bin und eigentlich für diesen Fall nur ein Beispiel/Starthilfe benötige, damit ich es in Zukunft ähnlich machen kann, bzw. generell weiterkomme.

Viel verlangt, aber vielleicht erbarmst du dich ja... 😳
 
Zuletzt bearbeitet von einem Moderator:
na dann zeige mal deine errors und die klassen dazu 🙂

Oh, das ist nett - ich will dich hier nicht zu sehr in Beschlag nehmen :meld:

Ich habe jetzt meine Klassen angepasst, sie sehen nun so aus:

Java:
public class Start {

	public static void main(String[] args) throws Exception {
	
		Daten loginDaten = new Daten();
		loginDaten.erfasseDaten();
		
		Menu menu = new Menu(loginDaten);
		
	}
}

Java:
import java.io.*;

public class Daten {

	private String loginDaten;
	
	public void erfasseDaten() throws Exception {
	
		BufferedReader myReader = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.print("Input: ");
		String loginDaten = myReader.readLine();
		setLoginDaten(loginDaten);
		
		Menu neu = new Menu();
	}

	public String getLoginDaten() {
		return loginDaten;
	}
		
	public void setLoginDaten(String a) {
		loginDaten = a;
	}
	
}

Java:
public class Menu {

	private Daten loginDaten;

	public Menu(Daten loginDaten) {
	
		this.loginDaten = loginDaten;

		Daten neu = new Daten();	
		String host = neu.getLoginDaten();
		System.out.println("Output: " +host);
				
	}
}


Und hier der Error (ich wollte jetzt nicht zuviel an deinem Code rumspielen in der Befürchtung mehr kaputt als heile zu machen):

Code:
C:\Users\Checkmate\Desktop\NEW>javac *.java
Daten.java:15: error: constructor Menu in class Menu cannot be applied to given types;
                Menu neu = new Menu();
                           ^
  required: Daten
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error


Edit: Ich weiß nicht wie ich von "Daten" dann auf "Menu" weiterleiten soll, mit deiner Lösung.

Edit 2: Ich habe einfach "Menu neu = new Menu();" rauskommentiert. Der Output bleibt leider trotzdem "null" ;(
 
Zuletzt bearbeitet von einem Moderator:
So mal auf die Schnelle
Java:
public class Menu {
 
    private Daten loginDaten;
 
    public Menu(Daten loginDaten) {
    
        this.loginDaten = loginDaten;
 
        String host = loginDaten.getLoginDaten();
        System.out.println("Output: " +host);
                
    }
}

Versuch es mal so. Es ergibt einfach keinen sinn erst ein Objekt von Daten zu übergeben um danach ein neues anuzlegen und das alte nichtmal zu benutzen.

(Du hattest ein neues Datenobjekt angelegt und mit dem nie irgendwelche loginDaten eingelesen, daher das null)
 
So mal auf die Schnelle
Java:
public class Menu {
 
    private Daten loginDaten;
 
    public Menu(Daten loginDaten) {
    
        this.loginDaten = loginDaten;
 
        String host = loginDaten.getLoginDaten();
        System.out.println("Output: " +host);
                
    }
}

Versuch es mal so. Es ergibt einfach keinen sinn erst ein Objekt von Daten zu übergeben um danach ein neues anuzlegen und das alte nichtmal zu benutzen.

(Du hattest ein neues Datenobjekt angelegt und mit dem nie irgendwelche loginDaten eingelesen, daher das null)

JUHUUUUUUUUUU! Es klappt! Hurra hurra! :toll: :applaus:

Super, vielen vielen Dank an euch alle 🙂


So, ich kaue jetzt erstmal alles durch was ihr geschrieben habt, damit ich das auch richtig verstehe!

Danke nochmal! 🙂
 
Schau dir das nochmal an: Galileo Computing :: Java ist auch eine Insel – 3 Klassen und Objekte

Dir ist schon bewusst, dass du zwei Menus machst und zwei Daten?

Zu deinem Fehler: Im Zweiten code Zeile 15 machst du ein neues Menu und übergibst nix. Im 3. Code Zeile 5 sagst du aber dass man Daten übergeben muss.

required: Daten
found: no arguments

Okay, werde ich machen!
Ich muss ehrlich sagen, dass ich gerade zum Ende des Threads nicht mehr richtig wusste was ich da eigentlich noch mache... aber damit das nicht so bleibt, schaue ich mir das alles nochmal an.

🙂 Danke!
 

Zurück
Oben