Kapselung public / private verständis problem

kantaki

Mitglied
Hallo,
also ich weiß das man setters und getters public macht, und class variables private.

also ich dachte jedenfalls das ich es verstanden habe bis ich ein praktisches beispiel hatte.
undzwar programmiere ich gerade schiffeversenken.
Java:
public class Ships {
	private String name;
	private ArrayList<String> location = new ArrayList<String>();

	public ArrayList<String> getLocation() {
		return location;
	}

	public void setLocation(ArrayList<String> n) {
		location = n;
	}
ich denke bis jetzt drüfte noch alles richtig sein.
Bevor ich weiterschreibe sollte ich vielleicht noch sagen das location 3 strings beinhaltet
zb A0 A1 A2


Das input ist die benutzereingabe zb A0. JEtzt habe ich mir überlegt wie ich den String in location löschen kann, wenn er mit der benutzer eingabe übereinstimmt. buffer ist ein "remote control" (so stand es jedenfalls im buch) für die location arraylist.

[strike]Irgentwie fühlt es sicht aber nicht richtig an und ich bekomme auch immer einen runtime error.
sieht vielleicht irgentwer einen fatalen fehler in diesem codeschnipsel ?[/strike]
Java:
	public String gameCheck(Ships ship, String input) {
		String result = "miss";
		ArrayList<String> buffer = ship.getLocation();
		for (String count : ship.getLocation()) {
			if (count.equalsIgnoreCase(input)) {
				result = "Hit";
				buffer.remove(buffer.indexOf(count));

				if (buffer.size() == 0) {
					result = "Kill - GameOver";
					break;
				}
			}

		}

Java:
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at Game.gameCheck(Game.java:14)
	at Game.gameStart(Game.java:41)
	at Game.main(Game.java:53)
zeile 14 ist
for (String count : ship.getLocation()) {
 
Zuletzt bearbeitet:

kantaki

Mitglied
ups gerade gesehen das ich das break falsch gesetzt habe, daher kam der runtime fehler.
trotzdem.

ist es richtig hier
ArrayList<String> buffer = ship.getLocation();
...
buffer.remove(buffer.indexOf(count));
den wert so zu ändern ?
 
G

Gast2

Gast
nein. Da bekommst du auch eine ConcurrentModificationException.
Wenn du in der Schleife Objekte aus der Liste entfernen willst musst du dir entweder alle Objekte in einer separaten Liste merken und später entfernen oder den Iterator nutzen, der bietet dir die Methode remove() an.
 
G

Gast2

Gast
Hm, ich glaube nicht dass der TO (halb-)fertigen Code zum Thema schiffe versenken sucht. Die Frage war wohl eher wie die er die Exception los wird.
 

hdi

Top Contributor
Ugh, wie kommst du auf die Idee, dass das mit den Getter und Setter Methoden in deiner Ship(s) Klasse eine gute Idee wär?
Womit der liebe Gassst wohl nicht sagen will, dass Datenkapselung keine gute Idee ist. Also das mit private ist schon korrekt. Aber in der Tat solltest du den Getter & Setter nochmal überdenken. Der Getter sollte - wenn du denn die gesamte List liefern willst - zumindest eine nicht-modifizierbare Liste liefern:

Java:
return Collections.unmodifiableList(location);

Also read-only. Sonst kann man die Location verändern ohne jemals den Setter aufgerufen zu haben, was ja wieder am Sinn von dem Ganze vorbeigeht.

Und bzgl des Setters ist es vllt auch besser lieber so Methoden wie moveLeft() etc anzubieten. Ist für den Caller angenehmer, und du kannst innerhalb der Klasse leichter kontrollieren was mit der Location geschieht.

Weiterhin solltest du deine Liste nicht als
Code:
ArrayList
deklarieren, sondern als
Code:
List
. Du musst wohl keine ArrayList-spezifischen Methhoden aufrufen. Stichwort Abstrahierung, Flexibilität usw.

Und nur um das nochmal zu unterstreichen: Dein Problem hat nichts mit public oder private zu tun.
 
Zuletzt bearbeitet:

kantaki

Mitglied
okay danke für die vielen antworten.

du hast recht meine setter methode ist verbesserungswürdig.
allerdings bin ich noch nicht sehr weit in meinem buch dh list / unmodifizierte liste kenne ich halt noch nicht.

zum glück gibt es eine dokumentierte api
 
G

Gassst

Gast
Womit der liebe Gassst wohl nicht sagen will, dass Datenkapselung keine gute Idee ist.

Im Gegenteil, Datenkapselung ist eine sehr gute Idee, leider ist in obigem Beispiel absolut gar nichts gekapselt oder versteckt, also genau das Gegenteil was man mit Datenkapselung erreichen will.

Ich habe das Gefühl von vielen, auch erfahrenen wie dir, Mitgliedern hier wird die "Variablen private, Getter & Setter" Geschichte wie ein Dogma heruntergebetet und als Allheilmittel für vernünftige Datenkapselung & Information Hiding postuliert. Das ist aber vollkommener Unsinn und wie man am obigen Beispiel sieht einfach nur falsch. Blöderweise wird sowas dann von weniger Erfahrenen Membern und Anfängern einfach unreflektiert nachgeplappert und man erhält Code wie den obigen...
 

kantaki

Mitglied
Im Gegenteil, Datenkapselung ist eine sehr gute Idee, leider ist in obigem Beispiel absolut gar nichts gekapselt oder versteckt, also genau das Gegenteil was man mit Datenkapselung erreichen will.

Ich habe das Gefühl von vielen, auch erfahrenen wie dir, Mitgliedern hier wird die "Variablen private, Getter & Setter" Geschichte wie ein Dogma heruntergebetet und als Allheilmittel für vernünftige Datenkapselung & Information Hiding postuliert. Das ist aber vollkommener Unsinn und wie man am obigen Beispiel sieht einfach nur falsch. Blöderweise wird sowas dann von weniger Erfahrenen Membern und Anfängern einfach unreflektiert nachgeplappert und man erhält Code wie den obigen...
ich lese head first java und ich bin erst auf seite 150. mir wurde gesagt am anfgang sollte ich einfach jede class variable private machen setter getter public
 
B

bygones

Gast
Ich habe das Gefühl von vielen, auch erfahrenen wie dir, Mitgliedern hier wird die "Variablen private, Getter & Setter" Geschichte wie ein Dogma heruntergebetet und als Allheilmittel für vernünftige Datenkapselung & Information Hiding postuliert. Das ist aber vollkommener Unsinn und wie man am obigen Beispiel sieht einfach nur falsch. Blöderweise wird sowas dann von weniger Erfahrenen Membern und Anfängern einfach unreflektiert nachgeplappert und man erhält Code wie den obigen...
also soll man einen Anfaenger mit Information Hiding, Dependency Injection und Immutablity gleich volllabern ? gewiss der richtige ansatz !
 

hdi

Top Contributor
mir wurde gesagt am anfgang sollte ich einfach jede class variable private machen setter getter public
Also das mit private stimmt. Zumindest wenn wir von Instanz-Variablen sprechen. Statische Variablen sind öfters mal public (zB Konstanten). Setter und Getter müssen aber nicht public sein. Der Sinn von dem ganzen ist im Endeffekt dass du im Setter eine kontrollierte Zuweisung machen kannst:

Java:
setX(X x){
  boolean xOkay = checkStuff();
  if(okay){
     this.x = x;
  }
  else{
     // Exception, oder was auch immer
  }
}

Das funktioniert natürlich unabhängig vom Access Modifier des Setters. public sollte er nur dann sein wenn eine außenstehende Instanz den Wert ändern können soll. Aber auch private Setter machen Sinn, da diese Kontrolle i.d.R. ja auch für Zugriffe aus der eigenen Klasse heraus gelten soll. Entsprechend sollte man auch bei Schreibzugriffen innerhalb der eigenen Klasse immer einen Setter verwenden, niemals eine Direkt-Zuweisung - auch wenn diese immer möglich ist. Aber man läuft Gefahr die Kontrolle des Setters zu umgehen.

Für den Getter gilt etwas ähnliches: Den schreibst du nur, wenn die entsprechende Information für außenstehende Instanz bekannt sein soll. Handelt es sich um irgendeine interne Hilfsvariable, gibt es keinen Grund das zu veröffentlichen. In dem Fall kannst (sollst!) du dir den Getter komplett sparen. Manche Leute schwören zwar auch hier auf einen private Getter, aber i.d.R. macht ein klassischer Getter nichts weiter als ein return des Wertes, da macht es also keinen Unterschied ob du den Lesezugriff über den Getter oder direkt machst.

Und als letztes gilt: Du kannst die "typischen" Getter/Setter auch gegen sinnvollere Methoden austauschen. Ein Getter muss nicht immer die entsprechende Variable returnen, und ein Setter muss nicht unbedingt als Parameter etwas nehmen, was der entsprechenden Instanz-Variable zu 100% gleicht. Zwei Beispiele die auch in deinem Fall passend sein könnten habe ich dir dafür genannt.

also soll man einen Anfaenger mit Information Hiding, Dependency Injection und Immutablity gleich volllabern ? gewiss der richtige ansatz !
Find ich schon. Mich stört es hier auch ein wenig dass man sich meist nur auf die eigentliche Fragestellung beschränkt. Wieso denn nicht ein Schritt weiter gehen und dem Fragesteller weitere Tipps geben? Wenn ihm dass dann zu heavy ist, kann er es noch immer ignorieren. Aber jmd der wirklich interessiert ist saugt solche Info-Häppchen nur zu gerne auf, so war/ist es bei mir zumindest. Wenn die Antwort immer nur von der eigentlichen Frage abhängt und kein Stück weiter, wird dieser Anfänger zu einem Fortgeschrittenen, und vllt auch Profi aber macht noch immer den selben S******. Immerhin kommt er nicht auf die Idee ein neues Topic aufzumachen mit der Frage "Information Hiding, Dependency Injection und Immutablity"
 
Zuletzt bearbeitet:

kantaki

Mitglied
hmm... also dient das ganze einfach nur als schutz vor falschen zuweisungen. zb die instanz variable Zeit sollte nie negativ sein, also macht man eine simple if abfrage in der setter methode.

okay, müssen instanz variablen nun IMMER private sein? was wenn eine variable keine wert beschränkung hat, dürfte man in diesem fall die instanz variable public deklarieren ?

ups, das hast du schon in deinem ersten satz gesagt.

okay hat sich erledigt danke =)
 

hdi

Top Contributor
hmm... also dient das ganze einfach nur als schutz vor falschen zuweisungen.
You got it! :toll: Zumindest was Setter angeht. Das private alleine dient erstmal dazu dass die Info nicht öffentlich bekannt gemacht wird.

okay, müssen instanz variablen nun IMMER private sein? was wenn eine variable keine wert beschränkung hat, dürfte man in diesem fall die instanz variable public deklarieren ?
Nein. Denn wer weiß, vllt willst du doch mal eine Beschränkung einführen. Wenn du von anfang an die variable private gemacht hast und über Setter arbeitest, musst du nur den Setter ändern und fertig. Wenn du Direkt-Zuweisungen hast darfst du deinen gesamten Code durchklappern um das an jeder Stelle zu ändern. Die Wahrhscienlichkeit dass du eine Stelle übersiehst ist recht groß. And that's where Bugs come from ;)
 

kantaki

Mitglied
You got it! :toll: Zumindest was Setter angeht. Das private alleine dient erstmal dazu dass die Info nicht öffentlich bekannt gemacht wird.


Nein. Denn wer weiß, vllt willst du doch mal eine Beschränkung einführen. Wenn du von anfang an die variable private gemacht hast und über Setter arbeitest, musst du nur den Setter ändern und fertig. Wenn du Direkt-Zuweisungen hast darfst du deinen gesamten Code durchklappern um das an jeder Stelle zu ändern. Die Wahrhscienlichkeit dass du eine Stelle übersiehst ist recht groß. And that's where Bugs come from ;)

ah so langsam erkenne ich den vorteil von OOP =)
 
G

Gassst

Gast
also soll man einen Anfaenger mit Information Hiding, Dependency Injection und Immutablity gleich volllabern ? gewiss der richtige ansatz !
Erklär mal wo ich das denn gesagt haben soll? Das kann man von mir aus halten wie man will. Ich sagte, dass man einem Anfänger nichts falsches beibringen soll und genausowenig Dogmen eintrichten soll. Da sollen sie ihre Felder lieber public lassen bis sie selbst irgendwann in ein Problem rennen.
 

hdi

Top Contributor
Na das ist ja toll ;) Tipp: Wenn du einen Satz in deinem Buch liest, nimm das nicht einfach so hin. Hinterfrage den Sinn davon. Wenn du etwas nicht nachvollziehen kannst, dann frag hier nach. In Lehrbüchern steht halt auch manchmal Mist. (Wobei es wahrscheinlicher ist, dass es einfach nur schlecht erklärt ist)
 
M

maki

Gast
Da muss mich Gassst zustimmen,

Getter bieten erstmal keine Kapselung (sondern nur Information Hidung), Methoden machen Kapselung (wie getter) aber u.U. möglich.

Beispiel für einen Getter der keine Kapselung bietet aus dem Code des TS:
Java:
    public ArrayList<String> getLocation() {
        return location;
    }
[c]location[/c] ist hier eine mutable ArrayList, d.h. wenn man sich die location holt, kann man munter ausserhalb der Shipklasse daran ändern -> keine Kapselung
Der Setter hat übrigens dasselbe Problem, da kann man direkt von aussen den internen Zustand der Klasse ändern.

Zur Sache mit Gettern & Settern:
Für alle Attribute einen Getter & Setter zu machen kommt aus dem JavaBeans Standard, JavaBeans sind keine "richtigen" Objekte sondern nur Datenstrukturen, hätte man damals in der JavaBeans spec. die Getter & Setter weggelassen und nur public Fields draus gemacht, hätte man gar nix an Kapselung eingebüsst ;)

Wenn man keine JavaBEans, also "dumme" Datenstrukturen programmieren will, sollte man sich mehr Gedanken darüber machen wie die Schnittstelle des Objektes eigentlich aussehen soll.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
J Klasse wird als private erkannt obwohl sie public deklariert ist Java Basics - Anfänger-Themen 3
D Klassenvariablen standardmäßig private oder public? Java Basics - Anfänger-Themen 2
B public/private nur 1x schreiben Java Basics - Anfänger-Themen 3
T public-private problem Java Basics - Anfänger-Themen 5
N public class -> public method -> variable private? Java Basics - Anfänger-Themen 10
G field public/private wann Java Basics - Anfänger-Themen 11
J Public / Private Keys speichern bzw. lesen? Java Basics - Anfänger-Themen 8
G GUI Controls private oder public Java Basics - Anfänger-Themen 6
G Variablen public oder private? Java Basics - Anfänger-Themen 9
S private public Java Basics - Anfänger-Themen 5
R private / public Frage Java Basics - Anfänger-Themen 7
G Public ,private,protected Java Basics - Anfänger-Themen 1
A public/private/etc. Zusatz weglassen Java Basics - Anfänger-Themen 2
U public, private, protected und "default access" - Java Basics - Anfänger-Themen 14
H private anstatt public Java Basics - Anfänger-Themen 2
H public und private Java Basics - Anfänger-Themen 5
A Public/Private und wie importieren? Java Basics - Anfänger-Themen 13
C Kann mir jemand sagen warum public void unzulässig ist? Java Basics - Anfänger-Themen 2
Say public/default Interface Java Basics - Anfänger-Themen 9
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
Denix The public type Main must be defined in its own fileJava(16777541) Java Basics - Anfänger-Themen 13
melaniemueller Datenkapselung Sichtbarkeit public Java Basics - Anfänger-Themen 4
NaZuRe Geld(Wert) von der public static void main in die public static void Blackjack Java Basics - Anfänger-Themen 2
S public static boolean Java Basics - Anfänger-Themen 4
Vamecruft Compiler-Fehler public static void zu static String ändern Java Basics - Anfänger-Themen 2
D public ArrayList(Collection<? extends E> c); Java Basics - Anfänger-Themen 2
J Methoden Methoden einer public class AutoCompleteTextField verwenden Java Basics - Anfänger-Themen 14
G Klassen Mit fremder Klasse auf public Methode zugreifen Java Basics - Anfänger-Themen 23
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
Javafan01 Dateiname und Public class Java Basics - Anfänger-Themen 4
C Methoden Unterschied zwichen public int, public static int und public static void Java Basics - Anfänger-Themen 2
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
J Frage zu: public static void main (String[]args) Java Basics - Anfänger-Themen 1
L RSA Public Key einlesen Java Basics - Anfänger-Themen 0
K Public Attribute oder getter - funktioniert leider beides hier nicht Java Basics - Anfänger-Themen 5
V Was bewirkt das Schlüsselwort extends in Verbindung mit class bzw. public class ? Java Basics - Anfänger-Themen 2
I Methoden public void paintComponent (Graphics g) Java Basics - Anfänger-Themen 4
M public static int in ActionListener Java Basics - Anfänger-Themen 6
L Was genau macht "public static void" ? Java Basics - Anfänger-Themen 12
B ja ja schon wieder einer mit einer public static void main(string[] args) Frage... Java Basics - Anfänger-Themen 8
D neue public static class variablen in array speichern? Java Basics - Anfänger-Themen 6
T Variablen Getter-Setter vs Public Variable? Java Basics - Anfänger-Themen 5
K modifier public Java Basics - Anfänger-Themen 3
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
T Java Code Hilfe - public void xxx() Java Basics - Anfänger-Themen 2
T public void - Problem Java Basics - Anfänger-Themen 10
R public static void Rückgabe Java Basics - Anfänger-Themen 5
P Compiler-Fehler public static void main, Grundloses Problem Java Basics - Anfänger-Themen 4
N Java UML: Eine Frage zu public-Variablen Java Basics - Anfänger-Themen 19
P Erste Schritte public oder static oder wie? Java Basics - Anfänger-Themen 7
J public enum? in Java Java Basics - Anfänger-Themen 9
C Erste Schritte felder, die public final sind Java Basics - Anfänger-Themen 6
B main methode ohne public Java Basics - Anfänger-Themen 5
W Frage public protected konstruktor Java Basics - Anfänger-Themen 6
V public Variablen vs Getter + Setter Java Basics - Anfänger-Themen 4
S Frage zu public static Java Basics - Anfänger-Themen 29
J "public int x" - Zugriff von anderer Klasse (selbes Package) nicht möglich?! Java Basics - Anfänger-Themen 4
E Methoden public static void main(String[] args) Java Basics - Anfänger-Themen 9
O Was bedeutet public class value? Java Basics - Anfänger-Themen 3
I Methoden Problem If/Else; Public Void Java Basics - Anfänger-Themen 6
S Warum sind Attribute der Klasse java.awt.Point public? Java Basics - Anfänger-Themen 3
K OOP Attribute von Klasse in die public class übertragen? Java Basics - Anfänger-Themen 7
T Kapselung: public-Methoden in protected-Klassen Java Basics - Anfänger-Themen 3
F public variable erstellen, & darauf zugreifen Java Basics - Anfänger-Themen 12
B Variablen Variablen in try / catch "public" machen? Java Basics - Anfänger-Themen 3
X enum Fehlermeldung "The public type Day must be defined in its own file" Java Basics - Anfänger-Themen 8
B Public boolean einfügen Java Basics - Anfänger-Themen 12
R jLabel lässt sich nicht public setzen?? Java Basics - Anfänger-Themen 15
Hamstinator public static. Gute Idee? Java Basics - Anfänger-Themen 6
-horn- public static double[][][] NAME() nur per RETURN Wertrückgabe möglich? Java Basics - Anfänger-Themen 20
S Public-Klassen und Dateien Java Basics - Anfänger-Themen 5
StickToFreak Fehler mit public class Java Basics - Anfänger-Themen 13
K konstruktur als public definieren Java Basics - Anfänger-Themen 11
StickToFreak public class problem ôÔ Java Basics - Anfänger-Themen 3
H eine als public deklariete Variable wird nicht gefunden Java Basics - Anfänger-Themen 6
T Konstruktor mit oder ohne public-Bezeichner? Java Basics - Anfänger-Themen 4
T Geht so was? public void verkaufe (<X implements Produkt& Java Basics - Anfänger-Themen 8
P immer "public class". ? Java Basics - Anfänger-Themen 4
A kein zugriff auf variable trotz public? Java Basics - Anfänger-Themen 3
C public static void main(String[] args) Java Basics - Anfänger-Themen 6
D Frage zu public static void main. Java Basics - Anfänger-Themen 4
J public class Java Basics - Anfänger-Themen 15
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
G Vor oder hinter public static void main. ? Java Basics - Anfänger-Themen 8
G (Anfängerproblem) Problem mit dem Aufruf von public-Methoden Java Basics - Anfänger-Themen 3
O Unterschied zwischen static und public Java Basics - Anfänger-Themen 2
D Zugriff auf attribut anderer Klasse privat/public? Java Basics - Anfänger-Themen 9
B Warum manchmal public class und manchmal nur class Java Basics - Anfänger-Themen 3
A Javadoc nur bei public Klassen? Java Basics - Anfänger-Themen 3
T rotes herz public void paint(Graphics g) Java Basics - Anfänger-Themen 2
G Was ist public static void main(String[] args)? Java Basics - Anfänger-Themen 12
P public enum ";"expected Java Basics - Anfänger-Themen 7
B public und protected Java Basics - Anfänger-Themen 11
G <identifier> expected bei public void final Java Basics - Anfänger-Themen 3
R public Klassen Java Basics - Anfänger-Themen 12
I public Verständnisfrage Java Basics - Anfänger-Themen 5
F Warum sind Interface-Methoden public? Java Basics - Anfänger-Themen 19
C public void keyPressed(KeyEvent e) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben