Sollte ich den Standardzugriffsmodifikator verwenden oder nicht - Codierungspraxis?


8

Normalerweise definiere ich beim Erstellen neuer globaler Variablen nicht den Zugriffsmodifikator. Gemäß Java wird der Standard-Zugriffsmodifikator für Eigenschaften übernommen. Wenn ich außerhalb des Standardbereichs auf diese Variable zugreifen muss, ändere ich ihren Zugriffsmodifikator, ansonsten lasse ich sie unverändert. Meine Frage lautet also: " Mache ich es richtig? Ist es normal, Standardzugriffsvariablen zu haben? Oder sollte ich für sie privat / öffentlich verwenden? Ist es eine gute Codierungspraxis, keine Zugriffsmodifikatoren zu verwenden? "

Antworten:


13

2 Dinge hier:

  1. benutze keine Globals :)
  2. Es ist üblich / bewährte Methode anzunehmen, dass alle Felder privat sind, es sei denn, es gibt einen zwingenden Grund, sie zu etwas anderem zu machen. In diesem Fall sollte der restriktivste Zugriff gewählt werden (normalerweise geschützt).

Natürlich gibt es immer Ausnahmen von der Regel, aber das sind die Grundlagen, von denen man ausgehen kann.


Gibt es einen bestimmten Grund für die erste Sache? "Verwenden Sie keine Globals".
Harry Joy

12
Auf Globals kann von überall in der gesamten Codebasis zugegriffen und geändert werden. Mehr als eine Handvoll davon reicht aus, um die potenzielle Komplexität eines Programms über die geistigen Fähigkeiten einer gesunden Person hinaus zu explodieren.
tdammers

Wenn sie sich wie staticin .NET verhalten, beeinträchtigen sie auch die Testbarkeit von Einheiten. Ein Gerät, das es verwendet, ist IMMER von ihnen abhängig und es gibt keine Möglichkeit, sie zu fälschen, um das zu testende Gerät zu isolieren.
StuperUser

1
und natürlich werden sie schnell zu einem Wartungsalptraum. Musste einmal eine "kleine" Änderung an einer Anwendung vornehmen, die mit Hunderten von Globals durchsetzt ist (ein Wert musste eine längere Eingabe ermöglichen, so etwas). Wir mussten schließlich nicht eine oder zwei, sondern Hunderte von Quellen an jeweils Dutzenden von Orten wechseln.
Jwenting

Tut mir leid, aber in Ihrem zweiten Punkt schlagen Sie vor, dass geschützt der restriktivste Zugriff ist. Der restriktivste Zugriff ist der Standardzugriffsmodifikator, nicht geschützt!
oOTesterOo

5

Einige allgemeine Programmierprinzipien hier:

  • Einfach ist besser
  • Geben Sie nicht das Offensichtliche an

...aber auch:

  • Explizit ist besser als implizit

Ich bin kein Java-Experte, aber die allgemeine Faustregel sollte lauten: Wenn das, was passiert, für jemanden offensichtlich ist, der mit der Sprache vertraut ist, ohne explizit zu sein, verwenden Sie das implizite Verhalten. Wenn dies jedoch jemanden auf die falsche Spur bringen könnte, dann sei auf jeden Fall explizit.


2
In Java ist der Standardzugriff eine separate Art von Zugriffen. Wenn Sie also einen Zugriffsmodifikator hinzufügen, werden die Zugriffe nicht angepasst, sondern in einen anderen geändert. Wenn Sie wirklich einen expliziten Standardzugriff benötigen, können Sie ihn nur explizit verwenden, indem Sie einen Kommentar verwenden.
Malcolm

-1

Java hat keine automatischen Eigenschaften, daher sollten alle Klassenmitglieder im Allgemeinen privat sein und bei Bedarf Methoden zum Abrufen / Festlegen für die öffentliche Verwendung verwenden.

Laut der Quelle (Oracle Java Docs) ist dies der empfohlene Ansatz.

"Verwenden Sie die restriktivste Zugriffsebene, die für ein bestimmtes Mitglied sinnvoll ist. Verwenden Sie privat, es sei denn, Sie haben einen guten Grund, dies nicht zu tun. Vermeiden Sie öffentliche Felder mit Ausnahme von Konstanten. Öffentliche Felder verknüpfen Sie in der Regel mit einer bestimmten Implementierung und schränken Ihre Flexibilität bei der Änderung Ihrer ein Code. "

http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html


1
Aber was ist, wenn Sie den Zugriff nur mit einigen Dingen und nicht mit allem teilen möchten (wie publicauch)?
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.