[JAVA] Soyez prudent avec les références de méthodes faciles

introduction

Bonjour. C'est Kecho. ** Utilisez-vous des références de méthodes? ** ** C'est pratique et lisible. Avec une telle méthode de référence. Je vais vous présenter quelques spécifications auxquelles je devrais faire attention.

Fréquemment utilisé

public class Main {
	public static void main(String[] args) throws Exception {
		Arrays.asList("test1", "test2").stream().forEach(System.out::println);
	}
}
// test1
// test2

Vous faites référence à une méthode statique. Vous pouvez également l'utiliser comme ça.

public class Main {
	public static void main(String[] args) throws Exception {
		Arrays.asList("test1", "test2").stream().map(String::toUpperCase).forEach(System.out::println);
	}
}
// TEST1
// TEST2

Vous appelez toUpperCase de la classe String. Facile à voir et pratique.

Comment appeler une méthode d'instance

De plus, bien que la méthode statique soit présentée ci-dessus, vous pouvez également utiliser la méthode d'instance.

class Customer {
	public String getName() {
		return "which1";
	}
}

public class Main {
	public static void main(String[] args) throws Exception {
		Arrays.asList(new Customer(), new Customer()).stream().map(Customer::getName).forEach(System.out::println);
	}
}
// which1
// which1

Vous pouvez écrire dans la même notation.

En d'autres termes

Ce qui suit peut être écrit avec le même Customer :: getName```.

map(e -> Customer.getName(e)) //Lors de l'appel d'une méthode statique
map(e -> e.getName()) //Lors de l'appel de la méthode d'instance de l'instance stockée

Question ici

Et si les deux méthodes peuvent être référencées? J'ai mentionné que vous pouvez appeler les méthodes statiques et d'instance dans la même notation, mais si vous avez les deux, laquelle sera utilisée?

class Customer {
	public String getName() {
		return "which1";
	}

	static public String getName(Customer customer) {
		return "which2";
	}
}

public class Main {
	public static void main(String[] args) throws Exception {
		Arrays.asList(new Customer(), new Customer()).stream().map(Customer::getName).forEach(System.out::println);
	}
}
  1. méthode statique
  2. Méthode d'instance
  3. Erreur de compilation
  4. Erreur d'exécution

↓ ↓ ↓ ↓ ↓ La bonne réponse est 3 erreurs de compilation! J'obtiens une déclaration d'erreur comme celle-ci.

both getName() and getName(Customer) from the type Customer are eligible



 Traduction japonaise:
```Référence de méthode ambiguë: getname () et getname (customer) de type customer sont éligibles```

 Vous obtenez une erreur de compilation car vous ne savez pas lequel regarder.

# À quoi dois-je faire attention après tout?
 Cette fois, j'ai lancé une erreur de compilation car les deux méthodes peuvent être référencées.
 Cependant, certains modèles sont difficiles à comprendre en un coup d'œil et ne peuvent pas être référencés, comme indiqué ci-dessous.
 1. Lorsque la méthode ne peut pas être référencée en raison de la visibilité
 2. Lorsque le nom de la méthode est légèrement différent
 3. Si les arguments de la méthode sont différents
 etc
 La méthode référencée peut provoquer un comportement inattendu de la part du développeur.

# Résumé
 Lorsqu'il s'agit d'objets qui utilisent des types implémentés par le développeur, il est plus sûr de s'abstenir d'utiliser des références de méthode.


Recommended Posts

Soyez prudent avec les références de méthodes faciles
Soyez prudent avec la méthode append de Python
(Note) Soyez prudent avec python argparse
⚠️ Méfiez-vous des valeurs d'argument par défaut de Python ⚠️
Soyez prudent lorsque vous exécutez CakePHP3 avec PHP7.2
Soyez prudent lorsque vous travaillez avec des fichiers texte compressés au format gzip
Méthode Kernel avec Python
Soyez prudent lors de la lecture de données avec des pandas (spécifiez dtype)
Débogage facile avec ipdb
TopView facile avec OpenCV
[Python3] Soyez prudent avec le décapage (strip, lstrip, rstrip)
[Introduction à Udemy Python3 + Application] 51. Soyez prudent avec les arguments par défaut
Environnement toxique facile avec Jenkins
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Chaîne de méthodes avec `return self`
[Python] Méthode de calcul avec numpy
Méthode de dessin graphique avec matplotlib
Synchronisation facile des dossiers avec Python
Rendre avec la syntaxe facile
Grattage Web facile avec Scrapy
Compilation facile de Python avec NUITKA-Utilities
Serveur HTTP facile avec Python
Connexion proxy facile avec django-hijack
Faites attention à LANG pour UnicodeEncodeError lors de l'impression du japonais avec Python 3