Maison >Java >javaDidacticiel >Comment obtenir un effet de passage par référence pour les primitives en Java ?

Comment obtenir un effet de passage par référence pour les primitives en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-12 22:15:03996parcourir

How Do You Achieve a Pass-by-Reference Effect for Primitives in Java?

L'équivalent Java du passage par référence pour les primitives

En C, le passage par référence permet aux fonctions de modifier des variables en dehors de leur portée. Java, cependant, fonctionne par transmission de valeur, ce qui rend difficile l'obtention du même effet pour les primitives.

Considérez le code suivant :

public class XYZ {
    public static void main(String[] args) {
        int toyNumber = 5;
        XYZ temp = new XYZ();
        temp.play(toyNumber);
        System.out.println("Toy number in main " + toyNumber);
    }

    void play(int toyNumber) {
        System.out.println("Toy number in play " + toyNumber);
        toyNumber++;
        System.out.println("Toy number in play after increment " + toyNumber);
    }
}

Ce code entraînera :

Toy number in play 5
Toy number in play after increment 6
Toy number in main 5

Contrairement à C , les modifications apportées à toyNumber dans play() n'affectent pas sa valeur dans main(). En effet, Java transmet les valeurs primitives par copie et non par référence.

Approches alternatives

1. Utilisez un Object Wrapper :

Une approche consiste à envelopper la primitive dans un objet et à transmettre l'objet par référence :

class ToyNumber {
    int toyNumber;
}
public static void main(String[] args) {
    ToyNumber toyNumber = new ToyNumber(5);
    XYZ temp = new XYZ();
    temp.play(toyNumber);
    System.out.println("Toy number in main " + toyNumber.toyNumber);
}
void play(ToyNumber toyNumber) {
    System.out.println("Toy number in play " + toyNumber.toyNumber);
    toyNumber.toyNumber++;
    System.out.println("Toy number in play after increment " + toyNumber.toyNumber);
}

Cette méthode permet les modifications apportées dans play() doivent être reflétées dans main(). Cependant, cela introduit une surcharge supplémentaire en créant un objet.

2. Renvoyer la valeur :

Une autre option consiste à renvoyer la valeur modifiée :

int play(int toyNumber) {
    ...
    return toyNumber;
}
public static void main(String[] args) {
    int toyNumber = 5;
    toyNumber = temp.play(toyNumber);
    System.out.println("Toy number in main " + toyNumber);
}

Cette approche fonctionne mais nécessite de changer le site d'appel pour recevoir la valeur de retour.

3. Variables statiques ou de classe :

Si play() et main() se trouvent dans la même classe ou instance de classe, envisagez d'utiliser une variable statique ou de classe :

class XYZ {
    static int toyNumber = 5;
    ...
}
public static void main(String[] args) {
    XYZ.play();
    System.out.println("Toy number in main " + XYZ.toyNumber);
}
static void play() {
    ...
    XYZ.toyNumber++;
    ...
}

Cette méthode permet aux deux fonctions de modifier la même variable, mais elle peut entraîner des problèmes de concurrence et n'est pas recommandée pour les applications multithread.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn