[JAVA] [Implementierung] Beseitigen Sie den bedrohlichen Geruch von Code

1. Leistung

1-1. Verwenden Sie entrySet (), um den Schlüssel und den Wert von Map abzurufen

bad.java


Map<String, String> map = ...;
for (String key : map.keySet()) {
    String value = map.get(key);
    ...
}

good.java


Map<String, String> map = ...;
for (Map.Entry<String, String> entry : map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    ...
}

1-2. Verwenden Sie Collection.isEmpty ()

bad.java


if (collection.size() == 0) {
    ...
}

good.java


if (collection.isEmpty()) {
    ...
}

1-3 Montage Stellen Sie sich nicht ein.

bad.java


List<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
if (list.containsAll(list)) { //Es macht keinen Sinn, es ist wahr.
    ...
}
list.removeAll(list); //Schlechte Leistung, klar()verwenden.

1-4 Geben Sie die Größe so weit wie möglich an, wenn Sie das Set initialisieren.

bad.java


int[] arr = new int[]{1, 2, 3};
List<Integer> list = new ArrayList<>();
for (int i : arr) {
    list.add(i);
}

good.java


int[] arr = new int[]{1, 2, 3};
List<Integer> list = new ArrayList<>(arr.length);
for (int i : arr) {
    list.add(i);
}

1-5. Verketten von Zeichenfolgen mit StringBuilder.

bad.java


String s = "";
for (int i = 0; i < 10; i++) {
    s += i;
}

good.java


String a = "a";
String b = "b";
String c = "c";
String s = a + b + c; //Kein Problem, der Java-Compiler kann optimiert werden
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
    sb.append(i);  //Verwenden Sie den manuellen StringBuilder, da der Java-Compiler innerhalb der Schleife nicht optimiert werden kann
}

1-6. Gibt ein zufälliges Element in der Liste zurück

good.java


List<Integer> list = otherService.getList();
if (list instanceof RandomAccess) {
    //Intern wird es von einem Array realisiert, sodass es randomisiert werden kann
    System.out.println(list.get(list.size() - 1));
} else {
    //Schlechte Leistung, die intern mit einer Linkliste erzielt werden kann
}

1-7 Verwenden Sie Set, wenn Sie die Collection.contains-Methode häufig aufrufen können

bad.java


ArrayList<Integer> list = otherService.getList();
for (int i = 0; i <= Integer.MAX_VALUE; i++) {
    //Zeitkomplexität O.(n)
    list.contains(i);
}

good.java


ArrayList<Integer> list = otherService.getList();
Set<Integer> set = new HashSet(list);
for (int i = 0; i <= Integer.MAX_VALUE; i++) {
    //Zeitkomplexität O.(1)
    set.contains(i);
}

2. Eleganter Code

2-1. Nach langer Konstante das obere L hinzufügen

bad.java


long value = 1l;
long max = Math.max(1L, 5);

good.java


long value = 1L;
long max = Math.max(1L, 5L);

2-2. Verwenden Sie keine magischen Zahlen

bad.java


for (int i = 0; i < 100; i++){
    ...
}
if (a == 100) {
    ...
}

good.java


private static final int MAX_COUNT = 100;
for (int i = 0; i < MAX_COUNT; i++){
    ...
}
if (count == MAX_COUNT) {
    ...
}

2-3. Weisen Sie der Sammlung keine statischen Elementvariablen zu

bad.java


private static Map<String, Integer> map = new HashMap<String, Integer>() {
    {
        put("a", 1);
        put("b", 2);
    }
};

private static List<String> list = new ArrayList<String>() {
    {
        add("a");
        add("b");
    }
};

good.java


private static Map<String, Integer> map = new HashMap<>();
static {
    map.put("a", 1);
    map.put("b", 2);
};

private static List<String> list = new ArrayList<>();
static {
    list.add("a");
    list.add("b");
};

2-4.Versuche mit Ressourcen empfohlen

bad.java


private void handle(String fileName) {
    BufferedReader reader = null;
    try {
        String line;
        reader = new BufferedReader(new FileReader(fileName));
        while ((line = reader.readLine()) != null) {
            ...
        }
    } catch (Exception e) {
        ...
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                ...
            }
        }
    }
}

good.java


private void handle(String fileName) {
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        String line;
        while ((line = reader.readLine()) != null) {
            ...
        }
    } catch (Exception e) {
        ...
    }
}

2-5 Löschen Sie nicht verwendete Mitglieder und Methoden

bad.java


public class DoubleDemo1 {
    private int unusedField = 100;
    private void unusedMethod() {
        ...
    }
    public int sum(int a, int b) {
        return a + b;
    }
}

good.java


public class DoubleDemo1 {
    public int sum(int a, int b) {
        return a + b;
    }
}

2-6 Löschen Sie nicht verwendete lokale Variablen

bad.java


public int sum(int a, int b) {
    int c = 100;
    return a + b;
}

good.java


public int sum(int a, int b) {
    return a + b;
}

2-7. Löschen Sie das Argument der nicht verwendeten Methode

bad.java


public int sum(int a, int b, int c) {
    return a + b;
}

good.java


public int sum(int a, int b) {
    return a + b;
}

2-8 Entfernen zusätzlicher Klammern Entfernen

bad.java


return (x);
return (x + 2);
int x = (y * 3) + 1;
int m = (n * 4 + 2);

good.java


return x;
return x + 2;
int x = y * 3 + 1;
int m = n * 4 + 2;

2-9. Konstruktoren von Dienstprogrammklassen sollten blockiert werden.

bad.java


public class MathUtils {
    public static final double PI = 3.1415926D;
    public static int sum(int a, int b) {
        return a + b;
    }
}

good.java


public class MathUtils {
    public static final double PI = 3.1415926D;
    private MathUtils() {}
    public static int sum(int a, int b) {
        return a + b;
    }
}

2-10 Entfernen Sie redundante Ausnahmefänge und -würfe

bad.java


private static String readFile(String fileName) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        String line;
        StringBuilder builder = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
        return builder.toString();
    } catch (Exception e) {
        throw e;
    }
}

good.java


private static String readFile(String fileName) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        String line;
        StringBuilder builder = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
        return builder.toString();
    }
}

2-11 Auf öffentliche statische Konstanten sollte über die Klasse zugegriffen werden.

bad.java


public class User {
    public static final String CONST_NAME = "name";
    ...
}

User user = new User();
String nameKey = user.CONST_NAME;

good.java


public class User {
    public static final String CONST_NAME = "name";
    ...
}

String nameKey = User.CONST_NAME;

2-12. Beurteilen Sie null nicht nach "Null Pointer Exception".

bad.java


public String getUserName(User user) {
    try {
        return user.getName();
    } catch (NullPointerException e) {
        return null;
    }
}

good.java


public String getUserName(User user) {
    if (Objects.isNull(user)) {
        return null;
    }
    return user.getName();
}

Verwenden Sie 2-13.String.valueOf anstelle von "" + value.

bad.java


int i = 1;
String s = "" + i;

good.java


int i = 1;
String s = String.valueOf(i);

2-14. Fügen Sie dem veralteten Code den Kommentar @Deprecated hinzu.

good.java


/**
 *sparen
 *
 * @veraltet Weil diese Methode ineffizient ist@link newSave()Verwenden Sie die Methode, um es zu ersetzen.
 */
@Deprecated
public void save(){
    // do something
}

3. Halten Sie den Code von Fehlern fern

3-1. Verbieten Sie die Verwendung des Konstruktors BigDecimal (double).

bad.java


BigDecimal value = new BigDecimal(0.1D); // 0.100000000000000005551115...

good.java


BigDecimal value = BigDecimal.valueOf(0.1D);; // 0.1

3-2. Gibt ein leeres Array und eine leere Sammlung zurück. Es ist nicht null.

bad.java


public static Result[] getResults() {
    return null;
}

public static List<Result> getResultList() {
    return null;
}

public static Map<String, Result> getResultMap() {
    return null;
}

public static void main(String[] args) {
    Result[] results = getResults();
    if (results != null) {
        for (Result result : results) {
            ...
        }
    }

    List<Result> resultList = getResultList();
    if (resultList != null) {
        for (Result result : resultList) {
            ...
        }
    }

    Map<String, Result> resultMap = getResultMap();
    if (resultMap != null) {
        for (Map.Entry<String, Result> resultEntry : resultMap) {
            ...
        }
    }
}

good.java


public static Result[] getResults() {
    return new Result[0];
}

public static List<Result> getResultList() {
    return Collections.emptyList();
}

public static Map<String, Result> getResultMap() {
    return Collections.emptyMap();
}

public static void main(String[] args) {
    Result[] results = getResults();
    for (Result result : results) {
        ...
    }

    List<Result> resultList = getResultList();
    for (Result result : resultList) {
        ...
    }

    Map<String, Result> resultMap = getResultMap();
    for (Map.Entry<String, Result> resultEntry : resultMap) {
        ...
    }
}

3-3 Rufen Sie die Methode equals auf, die vorzugsweise Konstanten oder bestimmte Werte verwendet.

bad.java


public void isFinished(OrderStatus status) {
    return status.equals(OrderStatus.FINISHED); //Kann eine Nullzeiger-Ausnahme sein
}

good.java


public void isFinished(OrderStatus status) {
    return OrderStatus.FINISHED.equals(status);
}

public void isFinished(OrderStatus status) {
    return Objects.equals(status, OrderStatus.FINISHED);
}

3-4. Die aufgelisteten Attributfelder müssen privat und unveränderlich sein

bad.java


public enum UserStatus {
    DISABLED(0, "Ungültig"),
    ENABLED(1, "Wirksamkeit");

    public int value;
    private String description;

    private UserStatus(int value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

good.java


public enum UserStatus {
    DISABLED(0, "Ungültig"),
    ENABLED(1, "Wirksamkeit");

    private final int value;
    private final String description;

    private UserStatus(int value, String description) {
        this.value = value;
        this.description = description;
    }

    public int getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }
}

3-5. Achtung String.split (String regex)

bad.java


"a.ab.abc".split("."); //Ergebnis ist[]
"a|ab|abc".split("|"); //Ergebnis ist["a", "|", "a", "b", "|", "a", "b", "c"]

good.java


"a.ab.abc".split("\\."); //Ergebnis ist["a", "ab", "abc"]
"a|ab|abc".split("\\|"); //Ergebnis ist["a", "ab", "abc"]

Nachtrag

Referenz Übersetzt aus Alibaba Developer District

Recommended Posts

[Implementierung] Beseitigen Sie den bedrohlichen Geruch von Code
RSpec-Ergebnisse der Überprüfung des Testcodes für die Benutzervalidierung
[Ruby] Code zur Anzeige des Tages
Eine Überprüfung des von Rails-Anfängern verwendeten Codes
Implementieren Sie iOS14 UICollectionView mit dem minimal erforderlichen Code.
Die Welt der Clara-Regeln (2)
Implementierung der Suchfunktion
Beurteilung des Kalenders
Die Welt der Clara-Regeln (1)
Die Welt der Clara-Regeln (3)
Angewandte Implementierung von Chat-Space
Die Idee der schnellen Sortierung
Implementierung der Pagenationsfunktion
Die Idee von jQuery
[Java] Vereinfachen Sie die Implementierung der Datenverlaufsverwaltung mit Reladomo
Die Falle, die die Standardimplementierung der Java 8-Schnittstelle mit sich bringt
Geben Sie beim Erstellen mit Maven den Zeichencode der Quelle an