Java-Codierungskonvention

Einführung

Konventionen, Praktiken und Einstellungen für die Java-Codierung zur Verbesserung der Lesbarkeit und Zuverlässigkeit. Bitte verwenden Sie es, nachdem Sie Folgendes beachtet haben.

Regel

Zunächst werden nur die Regeln vorgestellt. Eine Erklärung finden Sie unten.

Variablen / Konstanten

Klassendefinition

Implementierung / Vererbung

Methode

Logik

Gemeinsame Klasse

Kommentar

Variablen / Konstanten

boolean (Boolean) wird nicht als Argument verwendet ⇒ benutze enum

Boolescher Wert ist verwirrend, wenn er als Methodenargument verwendet wird. Sie können nicht verstehen, ohne die Methodenspezifikationen zu überprüfen. Wenn Sie enum verwenden, ist die Bedeutung leicht zu verstehen. Es spielt keine Rolle, ob es lokal in der Methode oder im Rückgabewert der Methode verwendet wird.

Boolean (Boolean) wird neu definiert und verwendet

boolean isActive = true;

Das Folgende ist leichter zu verstehen als das Obige.

boolean ACTIVE = true; boolean IN_ACTIVE = false; boolean status = IN_ACTIVE;

Sie können die Bedeutung auch dann verstehen, wenn Sie sie als Methodenargument verwenden Das Übergeben eines Booleschen Werts mit einer anderen Bedeutung führt jedoch nicht zu einem Kompilierungsfehler. Eigentlich ist Enum gut.

Boolean (Boolean) verwendet keine negativen Namen

Der Grund ist beim Lesen der Quelle schwer zu verstehen. Es ist besonders schwer zu verstehen, wann der negative Zustand eingestellt ist. In Kombination mit anderen Bedingungen ist es schwer zu verstehen.

boolean notFound = true; if (! notFound) {// ← verwirrend // Verarbeitung wenn gefunden. }

Verwenden Sie String nicht so oft wie möglich. ⇒ Machen Sie es zu einer Klasse, die String enthält

Der Grund ist mit String schwer zu verstehen. Der Name ist String, die Adresse ist String, der Firmenname ist String und der Abteilungsname ist String. Selbst wenn Sie eine seltsame Zuordnung vornehmen oder einen Fehler im Argument machen, tritt kein Kompilierungsfehler auf. Ich möchte wirklich die Klasse CompanyName verwenden, die String {} erweitert, kann es aber nicht. ⇒String ist endgültig. Also Klasse CompanyName {privater String-Wert; ...}.

Aber in jeder Hinsicht ist es ziemlich ärgerlich, dies zu versuchen. Sie müssen die Methoden von String neu definieren (obwohl Sie nur das benötigen, was Sie benötigen). Bei Verwendung einer externen Bibliothek ist immer eine Konvertierung / inverse Konvertierung erforderlich.

Definieren Sie null neu und verwenden Sie ⇒ Klassenname + IS_NULL

Ich verstehe die Bedeutung von null nicht, wenn ich es einer Methode zuweise oder übergebe, insbesondere wenn ich es einer Methode übergebe.

class Address { // Verarbeitung weggelassen } class MyClass {  public void method(Address addr) { // Verarbeitung weggelassen  } }

// Dies macht es schwierig zu verstehen, welche Null übergeben wurde MyClass myObj = new MyClass(); myObj.method (null); // ⇒ Ich weiß es nicht

// Du solltest wie folgt vorgehen Address Address_IS_NULL = (Address)null; myObj.method (Address_IS_NULL); // ⇒ Leicht zu verstehen

Beachten Sie, dass es besser erscheint, die Nulldefinition in der Klasse zu definieren (Adresse in diesem Beispiel). Zitieren Sie als Address.IS_NULL Aber wenn Sie nicht verantwortlich sind, gehen Sie wie folgt vor.

Verwenden Sie nicht die Konstante int ⇒ Verwenden Sie enum

Wenn es int ist, wird es nicht überprüft, auch wenn ein ungültiger Wert zugewiesen ist. Wenn das vorhandene System jedoch die int-Konstante verwendet, ist es unvermeidlich, die int-Konstante zu verwenden.

// Geschlechtsdefinition in int final int GENDER_MALE = 1; final int GENDER_FEMALE = 2; int intGender = GENDER_MALE; intGender = 100; // ⇒ Kein Compilerfehler

// Eigentlich ist es besser, enum als oben zu verwenden Gender enumGender = Gender.MALE;

Die int-Konstante verwendet nicht die Integer-Variable ⇒ == Um Beurteilungsfehler zu vermeiden

// das wird falsch sein new Integer(0) == new Integer(0) // Ich weiß nicht, ob dies ein Fehler ist.

Verwenden Sie keine String-Konstanten, die diskrete Zustände darstellen. ⇒ Verwenden Sie enum

Dies entspricht auch der Nichtverwendung der int-Konstante. Sie wird auch dann nicht überprüft, wenn ein ungültiger Wert zugewiesen wurde. Wenn das vorhandene System jedoch die String-Konstante verwendet, ist dies unvermeidlich.

final String GENDER_MALE = "male"; final String GENDER_FEMALE = "female"; String stringGender = GENDER_FEMALE; stringGender = "abc"; // ⇒ Kein Kompilierungsfehler

// Mach es mehr enum als oben Gender enumGender = Gender.FEMALE;

Ergänzung. In der Datenbank ist es ein numerischer Wert oder ein Zeichen, und wenn es im Speicher enum ist, ist es nicht kompatibel. ⇒ Es ist notwendig, sich gegenseitig zu konvertieren. Wenn Sie statisches fromInt (fromString) in der Aufzählung implementieren und toInt (toString) implementieren, können Sie eine Allzweckklasse erstellen, die die Konvertierung durchführt.

Zur Laufzeit vordefiniert und unverändert sollte ein Array anstelle einer Liste sein, und die Logik sollte eine Liste anstelle eines Arrays sein

Es kann schwierig sein, zu entscheiden, ob ein Array oder eine Liste verwendet werden soll, aber es ist eine gute Idee, sich für ein solches Prinzip zu entscheiden.

Konstanten nicht hart codieren

Wenn Sie nur eine Konstante schreiben, verstehen Sie die Bedeutung nicht. Beim Ändern ist es möglich, einen anderen Teil desselben Werts zu ändern.

// Dies ist nicht sinnvoll. Sie können das Geschlecht versehentlich ändern, wenn Sie 1 des Status in einen anderen Wert ändern. int status = 1; // Ich verstehe die Bedeutung nicht int gender = 1; // Ich verstehe die Bedeutung nicht

// Wenn Sie Folgendes tun, ist es einfacher zu verstehen und es gibt keine Fehler zu ändern. final int STATUS_ACTIVE = 1; final int STATUS_INSCTIVE = 2; final int GENDER_MALE = 1; final int GEDNER_FEMALE = 2; status = STATUS_ACTIVE; // Leicht zu verstehen gender = GENDER_MALE; // Leicht zu verstehen

Beachten Sie, dass dieses Beispiel wirklich in enum geändert werden sollte

Vermeiden Sie die Wiederverwendung von Variablen

Eine Variable sollte nur für eine Bedeutung verwendet werden. Ich weiß, aber sei dir bewusst, dass es nicht unmöglich ist, Fehler zu machen, wenn du beschäftigt bist.

Vermeiden Sie eine Neuzuweisung zu Variablen so weit wie möglich

Wenn Sie einer Variablen mehrmals zuweisen, ist der Wert bei der Verarbeitung mit dieser Variablen schwer zu verstehen. Was als "Neuzuweisung" bezeichnet wird, ist heikel. Zum Beispiel wäre das Folgende in Ordnung. Weisen Sie Instanzvariablen und verwandten Variablen Werte zu, wenn Sie Instanzen nacheinander in einer Schleife verarbeiten. Legen Sie einen Anfangswert fest, aktualisieren Sie den Wert unter bestimmten Bedingungen und verarbeiten Sie ihn dann mit dieser Variablen. Ein Beispiel für einen schlimmen Fall. Nachdem Sie einer Variablen einen Wert zugewiesen haben, verarbeiten Sie ihn mit dieser Variablen, weisen Sie ihn dann einem Wert zu und verarbeiten Sie ihn mit dieser Variablen. Siehe "Verarbeitungsblock erstellen".

Geben Sie das Parameterpräfix mit $ ein

Um das Verständnis zu erleichtern, dass die Absicht ein Typparameter ist Wenn die obige Absicht verwirklicht werden kann, können andere Methoden verwendet werden, aber dieser Bereich widerspricht nicht anderen Regeln.

Wenn es nicht erforderlich ist, dem Variablennamen einen geschäftsspezifischen Namen zu geben, verwenden Sie einen Namen, der dem Variablentyp zugeordnet ist.

Wenn es ein String ist, str usw. Dies ist besonders gut für allgemeine Klassen

Klassendefinition

Beschreiben Sie in der Instanzklasse (vorläufiger Name: Klasse zum Einfügen von Daten) die Felder am Anfang zusammen und setzen Sie den Feldkommentar in eine Zeile

Der Grund ist, die Liste der Felder schnell zu erfassen. In der Instanzklasse werden neben Feldern auch Routinemethoden wie Setter / Getter definiert. Wenn ich mir die Quelle anschaue, möchte ich in der Lage sein, sofort zu erfassen, welche Art von Feldern es gibt, indem ich den Anfangsteil betrachte. Schreiben Sie daher am Anfang nur die Felddefinition und schreiben Sie den Kommentar des Feldes in eine Zeile, ohne zu unterbrechen.

Die Logikklasse (vorläufiger Name: Logikzentrierte Klasse) beschreibt das Feld am Ende

In der Logikklasse möchte ich die öffentliche Methode kennen. Die für die interne Verarbeitung verwendeten Felder sind vom Standpunkt der Verwendung der Klasse nicht erforderlich, daher werden sie am Ende beschrieben. Öffentliche Variablen / Konstanten sollten am Anfang beschrieben werden, private Konstanten sollten am Ende beschrieben werden.

class public wird nur bei Bedarf angehängt

Wenn von außerhalb des eigenen Pakets eindeutig darauf verwiesen wird, machen Sie es öffentlich. Andere Klassen als (vorerst) haben keine Öffentlichkeit. Wenn nötig, machen Sie es zu diesem Zeitpunkt öffentlich, aber zu diesem Zeitpunkt wird es einen Zeitpunkt geben, um zu überlegen, ob dies öffentlich sein sollte oder nicht. Als negativer Effekt kann die Person, die für ein anderes Paket verantwortlich ist, eine ähnliche Klasse erstellen, ohne zu wissen, dass es eine Klasse gibt, die verwendet werden kann.

Führen Sie im Konstruktor keine eigentliche Verarbeitung durch, sondern initialisieren Sie einfach das Feld

Es ist nicht wesentlich, aber es ist gesunder Menschenverstand. Normalerweise führt der Konstruktor nicht viel Verarbeitung durch. Wenn Sie also eine andere Verarbeitung hinzufügen, können andere Personen dies falsch verstehen.

Initialisieren Sie das Feld als Methode und fügen Sie final hinzu

Felder werden in der Deklarationszeile nicht initialisiert. Führen Sie dies in der Initialisierungsmethode aus. Es wird einfacher zu verstehen sein, was initialisiert wird. Nützlich, wenn eine Neuinitialisierung erforderlich ist. Das letzte ist, um ein Überschreiben zu verhindern. Das Überschreiben der im Konstruktor aufgerufenen Methode macht es seltsam. Details weggelassen. Beachten Sie, dass der Name der Initialisierungsmethode der geerbten Klasse separat betrachtet werden muss.

Die Namen der Feldinitialisierungsmethoden sollten im System vereinheitlicht sein (z. B. init).

Natürlich, um Missverständnissen vorzubeugen. Machen Sie den Namen einer anderen gewünschten Methode nicht mit dem Namen der Initialisierungsmethode identisch.

Wenn der Konstruktor oder die Methode keine Verarbeitung enthält, schreiben Sie "keine Verarbeitung".

Konstrukteur Wenn keine Verarbeitung erfolgt, ist es richtig, diese Tatsache anzugeben. Es sollte jedoch eine Verarbeitung erfolgen, wenn die Feldinitialisierung zu einer Methode gemacht wird. Der Konstruktor der geerbten Klasse wird möglicherweise nicht verarbeitet Es ist ersichtlich, dass "nach Prüfung, ob eine Verarbeitung erforderlich ist oder nicht, entschieden wurde, dass dies nicht erforderlich ist".

Methode Gibt es eine Methode ohne Verarbeitung? ⇒ Es ist möglich, wenn die Methode überschrieben wird. Beschreiben Sie als "keine Verarbeitung" ⇒ In diesem Fall ist es wichtig zu beschreiben. Es ist ersichtlich, dass "nach Prüfung, ob eine Verarbeitung erforderlich ist oder nicht, entschieden wurde, dass dies nicht erforderlich ist".

Die Instanzklasse erstellt einen Komparator

In vielen Fällen ist dies nicht erforderlich, aber vorerst wird das Prinzip "Erstellen" verwendet. Es kann einzeln als "in dieser Klasse nicht notwendig" beurteilt werden.

Ziehen Sie in Betracht, Schnittstellen für Instanzklassen zu trennen, die von mehreren Logikklassen verwendet werden

Überlegen Sie, ob Sie es als Schnittstelle an eine andere Logikklasse übergeben möchten Lassen Sie die übergebene Klasse nicht tun, was Sie wollen. Sie können deutlich sehen, was die übergebene Klasse tun soll. Sie sollten (vielleicht) nur dafür eine Schnittstelle erstellen.

Erstellen Sie keine Schnittstelle nur mit Konstanten. ⇒ Machen Sie sie zu einer Klasse. ⇒ Wissen Sie nicht, wann sie implementiert ist

Der Grund ist wie oben. Wenn es sich um eine Klasse handelt, wird der Klassenname beschrieben, sodass leicht zu verstehen ist, um welche Konstante es sich handelt und wo sie definiert ist.

Wenn Sie eine Ausnahme in einem statischen Block auslösen müssen ⇒ Log & RuntimeException

Beachten Sie, dass dies ein ziemlich außergewöhnlicher Fall ist. In der allgemeinen Klasse gibt es eine statische Konstante, und es ist praktisch, beim Initialisieren einen statischen Block zu verwenden. Es wird zu dem Zeitpunkt ausgeführt, zu dem es zum ersten Mal verwendet wurde, sodass der Ausführungszeitpunkt nicht berücksichtigt werden muss. In einem statischen Block kann jedoch keine Ausnahme ausgegeben werden (← ein Kompilierungsfehler tritt auf). Wenn bei der Verarbeitung des statischen Blocks zwangsläufig eine Ausnahme generiert wird, fangen Sie diese intern ab, geben Sie ein Protokoll aus und lösen Sie eine RuntimeException aus. Die Kompilierung wird dann übergeben.

Erstellen Sie nach Bedarf eine lokale Klasse innerhalb der Klasse

Klassen, die nicht anderweitig verwendet werden, werden lokal definiert. Es ist ärgerlich und irreführend, wenn Sie nach draußen gehen. Entspricht der Begrenzung von Variablen auf einen möglichst engen Bereich.

Implementierung / Vererbung

Standardbibliotheksschnittstellen (Comparator, Iterator usw.) erstellen einen Dummy und verwenden ihn

Der Grund ist, dass die Liste der Komparatoren sofort in JavaDoc gefunden werden kann. . // Mach Folgendes. interface OurComparator extends Comparator {} class OurClass implements OurComparator { .... }

Verwenden Sie für die Implementierung und Vererbung den ursprünglichen Namen am Anfang.

Der Grund ist wie folgt Sie können sofort anhand des Namens sehen, was Sie implementieren / erben Wird in Eclipse daneben angezeigt.

// Zum Beispiel: / ** Mitarbeiter. * / class Staff {} /** Management. */ class StaffManager extends Staff{}

Problem Der Name sieht auf Englisch nicht richtig aus. Wenn mehrere Implementierungen / Vererbungen vorhanden sind, muss diese auf eine beschränkt werden. Wenn es mehrere Hierarchien gibt, wird der Name immer länger.

Legen Sie RuntimeException fest, wenn Sie die Methode der Basisklasse nicht verwenden möchten

Wenn Sie eine abgeleitete Klasse erstellen, benötigen Sie möglicherweise nicht die Basisklassenmethoden. Sie können den falschen Aufruf verhindern, indem Sie diese Methode überschreiben und eine RuntimeException auslösen.

Fügen Sie bei Bedarf endgültige Definitionen und Methoden zu Klassen hinzu

Das ist alltäglich, aber es scheint nicht getan zu sein. Ich auch. Machen Sie also eine Regel und vergessen Sie sie nicht.

Die Instanzklasse implementiert toString

Es ist nützlich zum Debuggen, daher möchte ich es definitiv implementieren. Sie können einen allgemeinen Helfer erstellen, indem Sie die erforderlichen Felder mit String verbinden.

Die Instanzklasse implementiert equals, hashCode, Comparable, clone

Diese sind oft unnötig. Machen Sie eine Regel, um es zu implementieren, und beurteilen Sie individuell, dass "es nicht notwendig ist, es in dieser Klasse zu implementieren".

Methode

Verwenden Sie keine negativen Formen in Methodennamen

Besonders wenn der Rückgabewert boolesch ist. Es ist dasselbe wie der Name der booleschen Variablen und schwer zu verstehen. Es ist möglicherweise nicht schwer zu verstehen, daher ist ein individuelles Urteilsvermögen erforderlich.

Rückgabewerte wie List geben null anstelle von emtpy zurück (Größe ist Null), wenn kein Wert vorhanden ist

Im Falle von leer kann die Verarbeitung, wann Daten erhalten werden und wann nicht, dieselbe sein. Dies ist ein Vorteil.

Es ist jedoch besser, ein explizites Urteil zu fällen. Lassen Sie uns entscheiden, welche im System verwendet werden soll. Siehe "Erstellen einer statischen Methode in der ursprünglichen Klasse, um festzustellen, ob der Rückgabewert normal ist".

Erstellen Sie eine statische Methode in der ursprünglichen Klasse, die bestimmt, ob der Rückgabewert normal ist

Es ist Sache des Anrufers, nach Rückgabe des Rückgabewerts zu entscheiden, was zu tun ist. Es ist unklar, ob die Methode wie beabsichtigt interpretiert wird.

// Gehen Sie wie folgt vor, um sich noch ein wenig zu verbessern class MyClass { / ** Aufrufmethode * /   public String method(String str) { // Einige Verarbeitung return null; // Fehler aufgetreten   } / ** Methode zur Ermittlung des Rückgabewerts * /   public static boolean errorHappened(String value) {     return (value == null);   } }

MyClass myObj = new MyClass(); String returnValue = myObj.method("aaaa"); if (MyClass.errorHappened(returnValue)) { // Fehlerbehandlung }

Ich weiß, dass es Kritik an "Übertreibung" gibt.

Verwenden Sie eine Methode mit einem booleschen Rückgabewert in der if-Anweisung, um einen vertrauten Namen daraus zu machen.

class MyClass { public boolean check(String str) { // Etwas zu tun   return true; } public boolean checkNormalEnded(String str) { // Etwas zu tun   return true;  } }

MyClass myObj = new MyClass(); // Ich verstehe die Bedeutung der if-Anweisung nicht. if (myObj.check("aaaa")) { // Einige Verarbeitung }

// Ich verstehe die Bedeutung hier if (myObj.checkNormalEnded("aaaa")) { // Einige Verarbeitung }

List, Set, Map usw. innerhalb des Objekts werden nicht als Rückgabewert der Methode verwendet, und bei Bedarf wird eine Kopie zurückgegeben.

Es besteht die Gefahr von Manipulationen, wenn Sie die interne Liste usw. zurücksenden. Senden Sie also die Kopie zurück. Serpentine, ArrayList ist klonbar, List ist jedoch nicht klonbar

Was tun, wenn Sie mehrere Rückgabewerte zurückgeben möchten? ⇒ Erstellen Sie eine Klasse

Sie erstellen eine Klasse für den Rückgabewert. Aber wenn die Klasse nicht anderswo verfügbar zu sein scheint, ist es sehr enttäuschend. Aber normalerweise bereuen Sie es und tun Sie dies.

Was tun, wenn Sie mehrere Rückgabewerte zurückgeben möchten? ⇒ Ein Objektarray zurückgeben. ⇒ Eine statische Methode zum Abrufen von Werten erstellen

// Wenn Sie im vorherigen Abschnitt "Ich mag es wirklich nicht" sagen, gehen Sie wie folgt vor class Box {   public Object[] getSize() { // Zuerst ist Höhe, dann ist Breite    return new Integer[]{5,10};   }   public static Integer getHeight(Object[] values) {    return (Integer)values[0];   }   public static Integer getWidth(Object[] values) {    return (Integer)values[1];   } }

Box box = new Box(); Object[] values = box.getSize(); int width = Box.getWidth(values); int height = Box.getHeight(values);

Machen Sie Methoden, für die keine internen Daten erforderlich sind, statisch

Es ist nicht erforderlich, neu zu schreiben. Der Klassenname ist so geschrieben, dass die Bedeutung leicht zu verstehen ist Ich denke, es ist vernünftig, dies zu tun, aber manchmal sehe ich etwas, das eine interne Methode ist.

Überlasten Sie nicht so viel wie möglich. ⇒ Machen Sie die Quelle leichter verständlich

Sie können unterscheiden, indem Sie die Argumente überprüfen, aber es ist problematisch Sollte durch den Methodennamen unterscheidbar sein

Logik

Denken Sie daran, dass die Programmierung einfacher zu verstehen ist als die Verarbeitungsgeschwindigkeit

Nun eine natürliche Anerkennung Wenn Sie Geschwindigkeit brauchen, tun Sie dies.

Wenn Sie der Meinung sind, dass die Logik "schwierig oder verwirrend" ist, denken Sie noch einmal darüber nach

Denken Sie an Folgendes Gibt es eine einfachere Logik? Ist die Idee nicht falsch? Ist es überhaupt die notwendige Logik? Wenn Sie es noch brauchen, tun Sie es!

Blockieren Sie die kollektive Verarbeitung

Um einen Prozess zu realisieren, können mehrere Zeilen geschrieben werden. Geben Sie beispielsweise Werte in einige Variablen ein und rufen Sie eine Methode auf. Blockieren Sie in solchen Fällen diese Zeilenreihen, um den Einzug zu verringern. Wenn Sie es zu einem Block machen, können Sie sehen, dass diese Linien eine Reihe von zusammenhängenden Prozessen sind. Sie können dem gesamten Block Kommentare hinzufügen Da Variablen innerhalb des Blocks definiert werden können, kann eine versehentliche Explosion von Variablen verhindert werden.

// Dies ist ein Kommentar für den gesamten Block, der eine Reihe von Verarbeitungen im Block beschreibt {    int a = 0;    String str = "abc"; // Weiter unten. }

Brechen Sie die else-Anweisung ein

// Viele Leute schreiben wenn ~ sonst wie folgt int a = 1; if (a == 1) { // Erforderliche Verarbeitung } else { // Ein anderer Prozess }

Beschreibe es wie folgt Der Grund ist, dass Sie das gesamte andere kommentieren können Siehe "Blockkohäsive Verarbeitung" oben.

if (a == 1) { // Erforderliche Verarbeitung } // Verarbeitung im Falle von else ⇒ Hier ist der Kommentar des gesamten else else { // Ein anderer Prozess }

Verwenden Sie den ternären Operator

Das ist natürlich, aber ich sehe oft Programme, die ich nicht benutze. Große Anzahl von Leitungen, redundant, schwer zu erkennen, nervig. Der verschachtelte ternäre Operator wird jedoch nicht verwendet.

// Zusätzlich, benutze den ternären Operator, auch wenn es nichts anderes gibt → Die Anzahl der Zeilen wird reduziert a = (logischer Ausdruck)? A = Algebra: a;

Wenn der Inhalt der if-Anweisung nur break ist, fahren Sie fort, geben Sie ihn zurück, werfen Sie ihn und beschreiben Sie ihn in derselben Zeile wie die if-Anweisung.

// Mach Folgendes if (logischer Ausdruck) {break;}

Der Grund ist, die Anzahl der Zeilen zu reduzieren und so viele wie möglich auf dem Bildschirm anzuzeigen. In anderen Fällen ist dies verboten, da die Logik nach unten fließt und es schwierig wird, sie zu erkennen.

Verwenden Sie equals, um die Gleichheit von String zu bestimmen

Gelegentlich sehe ich ein Programm, das nach == beurteilt wird. Wenn Sie genau hinschauen, können Sie Anämie bekommen. Darüber hinaus besteht es den Test. Der Grund für das Bestehen des Tests ist, dass er beim Kopieren identisch ist.

Bei der Beurteilung der String-Gleichheit wird die Konstante als Subjekt verwendet

Dies soll verhindern, dass es mit null fällt. Wenn Sie jedoch eine ordnungsgemäße Nullprüfung benötigen, müssen Sie diese in der vorherigen Zeile überprüfen.

String str = "bbbb"; if ("aaaa" .equals ((str))) {// Hinweis: "aaaa" sollte als Konstante definiert werden // Verarbeitung bei Übereinstimmung }

Boolean ist nicht neu

Boolean kann nur true, false (und null) sein und ist in der Boolean-Klasse definiert, sodass keine neuen erforderlich sind Beachten Sie, dass (neuer Boolescher Wert (wahr)) == (neuer Boolescher Wert (wahr)) falsch ist.

Boolean boolValue = Boolean.TRUE;

null gibt den Typ an

Abgesehen von der Zuweisung zu einer Variablen ist es leicht, Fehler zu machen, wenn Sie sie an ein Argument übergeben. Ich werde ängstlich und überprüfe die Methode der anderen Partei.

class MyClass {  public void method(String str) { // Etwas zu tun  } }

// Mach Folgendes MyClass myObj = new MyClass(); myObj.method((String)null);

Die Wahrheit ist, es ist besser, null neu zu definieren. Siehe "Neu definieren und null verwenden ⇒ Klassenname + IS_NULL".

Wenn, für, während nur ein Satz blockieren

Der Grund ist, dass es Fehler gibt, wenn ich versuche, eine Anweisung hinzuzufügen.

Verwenden Sie keine erweiterten for-Anweisungen in auftragsbewussten Schleifen

Das Ergebnis ist das gleiche, auch wenn ich es verwende, aber ich kann nicht sehen, dass es im Quellcode "in der richtigen Reihenfolge verarbeitet" wird.

Ziehen Sie in Betracht, mit einer konstanten Tabelle zu trennen, ohne Zweige zu verwenden (if, switch).

// Beispiel für die Verwendung der if-Anweisung int a = 1; String msg; if (a == 0) {  msg = "aaaa"; } else if (a == 1) {  msg = "bbbb"; } // Weiter unten.

// Mach Folgendes String[] msgs = new String[] {"aaaa","bbbb"}; msg = msgs[a];

Dieses Beispiel wird nicht geschätzt, aber beim Erstellen einer Zustandsmaschine ist es verwirrend, wenn Sie dies nicht tun. Beachten Sie, dass Sie die Sequenz zweistufig machen müssen, wenn der ursprüngliche Wert nicht Null ist Da es sich nur um eine konstante Tabelle handelt, ist sie kürzer und leichter zu erkennen. ⇒ Weniger Fehler

Wenn sonst keine Verarbeitung erfolgt, kommentieren Sie "Keine Verarbeitung".

int a = 0; if (a == 0) { // Beschreibe eine Verarbeitung } else { // Keine Verarbeitung }

Natürlich nicht alle if-Aussagen tun dies. Nur wenn Raum für Fragen ist. Es ist möglich zu vermitteln, dass "entschieden wurde, dass dies unnötig war, nachdem überlegt wurde, ob eine weitere Verarbeitung erforderlich war oder nicht".

Zerlegen Sie die zusammengesetzte Bedingung der if-Anweisung und verschachteln Sie sie

Es kann schwierig sein zu verstehen, da viele Bedingungen durch und in der if-Anweisung verbunden sind. Zerlegen Sie in einem solchen Fall die Bedingung und verschachteln Sie die if-Anweisung. Auch wenn Sie als "Amateur" kritisiert werden, haben Sie keine Angst. Der Schwerpunkt sollte darauf gelegt werden, das Verständnis zu vereinfachen, ohne Fehler hinzuzufügen.

Trennen Sie die zusammengesetzten Bedingungen in Klammern und geben Sie sie an

Wenn mehrere Bedingungen durch und / oder verbunden sind, ist es einfacher zu erkennen, ob jede in () eingeschlossen und getrennt ist.

Vermeiden Sie die Wiederverwendung von Objekten so weit wie möglich

Da die Erstellungskosten des Objekts verschwenderisch sind, kann es bei erneuter Verwendung zu einem Fehler kommen. Keine Sorge, es ist besser, ein neues Objekt zu erstellen. Wenn es für die Leistung erforderlich ist, verwenden Sie es natürlich erneut.

Stellen Sie sicher, dass Sie den Klassennamen für statische Methodenaufrufe verwenden. Verwenden Sie keine Variablennamen. Schreiben Sie den Klassennamen in Ihre eigene Klasse

Es wird deutlich, dass Sie eine statische Methode aufrufen, um die Lesbarkeit der Quelle zu verbessern.

Vermeiden Sie StringBuilder (StringBuffer) so oft wie möglich

Dies wird kritisiert, aber die Sichtbarkeit der Quelle ist wichtiger. Sicher ist die Leistung anders, aber in vielen Fällen ist die absolute Zeit in erster Linie kurz. Verwenden Sie StringBuilder nur, wenn Sie viele Schleifen haben. Beachten Sie, dass es bei meiner Messung ungefähr 10 Mal dauert, wenn StringBuilder (StringBuffer) nicht für die zusätzliche Verarbeitung von String verwendet wird.

Extrahieren Sie die Logik im Speicher in eine Methode zum einfachen Testen von Einheiten

Dies ist auch ein situatives Urteil, aber es ist besser, bis zu einem gewissen Grad auszugehen. Wenn Sie es jedoch übertreiben, erhöht sich die Anzahl der Methoden und Sie werden verwirrt sein.

Wenn Sie ein untergeordnetes Objekt zu List, Set, Map usw. hinzufügen, fügen Sie es unmittelbar nach dem neuen untergeordneten Objekt hinzu.

Sie können den Vorgang vergessen, der nach Neu hinzugefügt werden soll. Machen Sie es sich also zur Gewohnheit und vergessen Sie ihn nicht Dies ist (manchmal) ein verwirrender Fehler, um dies zu verhindern

Die obige Ausnahme ist, wenn der Wert für das neue Objekt festgelegt ist und abhängig von den Bedingungen möglicherweise nicht hinzugefügt wird.

Achten Sie darauf, bei der Ausnahmebehandlung endgültig hinzuzufügen, grundsätzlich nicht zu fangen

Es kann gefangen werden oder nicht, aber die meisten werden es nicht. Vergiss es nicht endlich Auch wenn eine endgültige Verarbeitung nicht erforderlich ist, fügen Sie eine leere endgültige hinzu und schreiben Sie "keine Verarbeitung".

Gemeinsame Klasse

Erstellen Sie eine gemeinsame Klasse für die Datums- und Uhrzeitverarbeitung. ⇒ Format vereinheitlichen, Datums- und Uhrzeitverarbeitung vereinheitlichen

Ich sehe, dass die Datums- und Uhrzeitverarbeitung in verschiedenen Teilen des Systems ähnlich ist. Das gleiche Format wird an verschiedenen Stellen beschrieben. Insbesondere bei der Verarbeitung von Daten muss außerdem verhindert werden, dass aufgrund von Zeitfehlern Fehler auftreten.

Erstellen Sie eine gemeinsame Klasse für Reflexion, Kommunikation, E / A usw. ⇒ Vermeiden Sie das Mischen mit anderer Logik

Es ist dasselbe wie ein DAO für den DB-Zugriff, und eine kleine spezielle Verarbeitung wie diese wird zu einer gemeinsamen Klasse.

Machen Sie das Zahlenarray für die Methodenargumente zu einem Wrapper anstelle eines Grundelements

Im Grundelement müssen Sie für jeden Typ eine Methode erstellen. Sie können mit Number im Wrapper vereinheitlichen. Big Decimal ist jedoch auch Number, was problematisch ist

Erstellen Sie eine abgeleitete Klasse, um den Klassennamen und den Methodennamen leicht verständlich zu machen

In einer allgemeinen Klasse stimmen der Klassenname und der Methodenname möglicherweise nicht mit dem Geschäftsinhalt überein. Definieren Sie in einem solchen Fall eine abgeleitete Klasse und geben Sie ihr einen beschreibenden Namen. Wenn Sie es einfach übertreiben, erhöht sich die Anzahl der Klassen.

Die Einrichtung einer gemeinsamen Klasse innerhalb des Projekts erhöht die Kosten, sollte jedoch gefördert werden

Die Einrichtung einer gemeinsamen Klasse innerhalb des Projekts ist eher ein kostenerhöhender Faktor. ⇒ Es sollte jedoch festgelegt werden. Die Wartungskosten und die Kosten für Mitglieder, die die Spezifikationen erfassen, sind höher. Die übliche Klassenentwicklung innerhalb des Projekts besteht darin, die Qualität zu verbessern. Wenn Sie dies nicht erkennen, werden Sie frustriert sein.

Wenn es sich innerhalb eines Unternehmens befindet, sollte es mit einer langfristigen Perspektive gepflegt werden.

Langfristig wird dies auch zu einer Kostensenkung führen.

Recommended Posts

Java-Codierungskonvention
Lose Java-Codierungskonventionen
So erzwingen Sie Codierungskonventionen in Java
Grundlegende Java-Namenskonventionen
Java
Informationen zu Alibaba Java-Codierungsrichtlinien
Java
Reihenfolge der Mitgliederbeschreibung in der Java-Codierungskonvention
Java lernen (0)
Java studieren ―― 3
[Java] -Array
Java geschützt
[Java] Anmerkung
[Java] Modul
Java studieren ―― 9
Java Scratch Scratch
Java-Tipps, Tipps
Java-Methoden
Java-Methode
Java (Konstruktor)
Java-Array
[Java] ArrayDeque
Java (überschreiben)
Java (Methode)
Java Day 2018
Java-Zeichenfolge
Java (Array)
Java statisch
Java-Serialisierung
Java Anfänger 4
JAVA hat bezahlt
Java studieren ―― 4
Java (gesetzt)
Java-Shell-Sortierung
[Java] compareTo
Java studieren -5
Java reflektierend 获 获 举
Java (Schnittstelle)
Java-Memorandum
Java-Array
Java studieren ―― 1
[Java] Array
[Erstellen] Ein Memorandum über das Codieren in Java
[Java] Polymorphismus
Java # 0 studieren
Java-Überprüfung
Java-Framework
Java-Funktionen
[Java] Vererbung
FastScanner Java
Java-Funktionen
Java Anfänger 3
Java-Memo
Java (Kapselung)
[Java] Überladung
Java dekompilieren
[Java] Anmerkung
Java Note
Java (add2)
JAVA (Karte)
[Java] -Schnittstelle