Astuces Java, astuces

Aperçu

Essayez simplement de le préciser tel quel. Je ne sais pas si cela sera utile. De plus, je ne pense pas que ce soit nécessairement spécifique à Java.

Contenu

Affectation multiple

Vous pouvez affecter la même valeur à plusieurs variables.

int x, y;
x = y = 10;
System.out.println(x); // 10
System.out.println(y); // 10

Cela semble être interprété comme suit. 10 est affecté à y, mais en Java, la valeur de l'expression d'affectation est également renvoyée, ce qui signifie que la valeur d'évaluation entière de (y = 10) est affectée à x.

x = (y = 10);

Comment écrire la méthode principale

Je pense que la méthode principale s'écrit généralement comme suit.

public static void main(String[] args) {
    System.out.println("Hello world!");
}

S'il s'agit de Java 5 ou version ultérieure, vous pouvez écrire comme suit.

public static void main(String... args) {
    System.out.println("Hello world!");
}

La seule différence est «String []» ou «String ...». Le premier est un tableau et le second est un argument de longueur variable, mais la méthode principale semble être l'un ou l'autre.

Juste une lunette

Vous pouvez créer une nouvelle étendue à l'aide de l'instruction if ou for, mais vous pouvez également créer une étendue simple sans branchement conditionnel ni boucle.

{
    int x = 10;
    System.out.println(x);  // 10
}

{
    int x = 100;
    System.out.println(x); // 100
}

// System.out.println(x); //Erreur de compilation

x est défini deux fois, mais cela ne provoque pas d'erreur de compilation car il a une portée différente. De plus, étant donné que la portée de «x» n'est que la plage entourée par l'accolade, il s'agit d'une erreur de compilation si vous essayez de faire référence à «x» en dehors de l'accolade.

Implémentation de HashSet

HashSet est une classe qui encapsule simplement HashMap en tant qu'implémentation. (* Ceci est une implémentation détaillée, donc elle peut changer à l'avenir.)

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

AbstractStringBuilder StringBuilder et StringBuffer sont écrits en JavaDoc comme s'ils étaient des sous-classes directement sous la classe Object, mais ce sont en fait des sous-classes de ʻAbstractStringBuilder. ʻAbstractStringBuilder est un package privé (pas une API publique) et ne peut pas être écrit en JavaDoc. (* Ceci est une implémentation détaillée, donc elle peut changer à l'avenir.)

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuilder>, CharSequence
{
//Omission
 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuffer>, CharSequence
{
//Omission

Définir une méthode dans une méthode

Normalement, Java ne vous permet pas de définir une méthode dans une méthode. Mais vous pouvez le faire avec le var introduit dans Java 10. (Je l'ai écrit dans un autre article)

Main.java


public class Main {
    public static void main(String[] args) {
        // func.capitalize()Peut être appelé avec
        //func est une variable locale et ne peut pas être appelée depuis l'extérieur de cette méthode
        var func = new Object() {
            private String capitalize(String s) {
                return s.substring(0, 1).toUpperCase() + s.substring(1, s.length()).toLowerCase();
            }
        };

        System.out.println(func.capitalize("tokyo")); // => Tokyo
        System.out.println(func.capitalize("TOKYO")); // => Tokyo
    }
}

Exécutez le code source Java sans compilation

J'ai écrit ceci dans un autre article, mais depuis Java 11, vous pouvez spécifier le fichier source et l'exécuter avec la commande java sans utiliser javac. Cela peut être utile pour un petit contrôle de fonctionnement. Eh bien, je ne pense pas que cela fonctionne vraiment sans compilation, mais c'est une compilation dans les coulisses.

Incorporer le traitement dans une méthode d'une classe existante

En Java, vous pouvez utiliser des classes anonymes pour intégrer le traitement dans des méthodes existantes.

List<String> list = new ArrayList<>() {
    @Override
    public boolean add(String s) {
        System.out.println("add called. arg: " + s);
        return super.add(s);
    }
};
list.add("hello"); // add called. arg: hello
list.add("world"); // add called. arg: world
System.out.println(list); // [hello, world]

Utilisez ʻinstanceof pour null`

Vous pouvez utiliser ʻinstanceof pour null`.

System.out.println(null instanceof Object); // false

Il est naturel que ce ne soit pas "vrai", mais je pense que le point d'intérêt est que "NullPointerException" ne peut pas être lancé. Le même résultat peut être obtenu avec une variable à laquelle «null» est affecté, il n'est donc pas nécessaire de vérifier «null» avant «instanceof».

null à lancer

Si une variable de type d'exception contient «null», «throw» lève «NullPointerException» quel que soit le type de variable.

RuntimeException e = null;
throw e; // NullPointerException

Cast null

Cela n'a pas beaucoup de sens, mais je ne peux pas faire d'exceptions pour le moment.

Object obj = null;
String str = (String)obj;
System.out.println(str); // null

Détermination de type qui n'autorise pas les sous-classes

Avec ʻinstanceof, le type d'instance est également true` pour les sous-classes de la classe spécifiée.

System.out.println("str" instanceof Object); // true

Pour les sous-classes, si vous voulez le rendre faux, vous pouvez comparer les types Class avec ʻequals` comme indiqué ci-dessous.

System.out.println(new Object().getClass().equals(Object.class)); // true
System.out.println("str".getClass().equals(Object.class)); // false

La séquence n'est pas de type sécurisé

Un tableau est une affectation compatible avec un tableau d'un type et un tableau d'une sous-classe de ce type. Par conséquent, le code suivant sera compilé et une erreur se produira au moment de l'exécution.

Object[] array = new String[3];
array[0] = new Integer(10); // ArrayStoreException

S'il s'agit d'une liste qui utilise des génériques, le problème ci-dessus ne se produira pas car une erreur de compilation se produira.

List<Object> list = new ArrayList<String>(); // incompatible types: ArrayList<String> cannot be converted to List<Object>

Détecter le débordement

Si un débordement se produit pendant une opération, le résultat sera incorrect sans aucune erreur. Il existe une méthode utilitaire dans la classe Math qui lève une exception lorsqu'un débordement se produit, vous pouvez donc détecter le débordement en interceptant l'exception.

System.out.println(Integer.MAX_VALUE + 1); // -2147483648
Math.addExact(Integer.MAX_VALUE, 1); // ArithmeticException: integer overflow

Eh bien, je pense que je devrais utiliser BigInteger depuis le début.

À la fin

Je serais heureux s'il y a un élément qui peut être utilisé comme référence. Si vous proposez autre chose, vous pouvez l'ajouter ou non.

Recommended Posts

Astuces Java, astuces
Astuces Java
CONSEILS relatifs au code Java
Conseils pour Play Framework2.5 (Java)
Java
Java
Astuces Java - Modificateurs de classe StaticUtility
Astuces Java - Résumé de l'exécution de Spring
[Java] Conseils pour l'écriture de la source
Apprendre Java (0)
Étudier Java ―― 3
[Java] tableau
Java protégé
[Java] Annotation
Tableau Java
Étudier Java ―― 9
Java scratch scratch
Méthodes Java
Méthode Java
java (constructeur)
Tableau Java
[Java] ArrayDeque
java (remplacement)
java (méthode)
Journée Java 2018
Chaîne Java
java (tableau)
Java statique
Sérialisation Java
java débutant 4
JAVA payé
Étudier Java ―― 4
Java (ensemble)
tri shell java
[Java] compareTo
Étudier Java -5
java réfléchissant 获 获 举
java (interface)
Mémorandum Java
Tableau Java
Étudier Java ―― 1
[Java] Array
Conseils pour le client REST de haut niveau Java
[Java] Polymorphisme
Étudier Java # 0
Revue Java
framework java
Fonctionnalités Java
[Java] Héritage
FastScanner Java
Fonctionnalités Java
java débutant 3
Mémo Java
java (encapsulation)
Héritage Java
[Java] Surcharge
Les bases de Java
Décompiler Java
[Java] Annotation
note java