CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet résolu : Java : Pourquoi ne faut-il pas déclarer cet attribut `static` ?

DébutPage précedente
1
Page suivantePage suivante
VivreUnEldorado VivreUnEldorado
MP
Niveau 15
17 février 2019 à 18:38:20

Salut à tous !

Je développe une appli Android qui communique avec une base de donnée Firebase Cloud Firestore. Pour ce faire j'ai donc recours à la classe `FirebaseFirestore`. Celle-ci, implémentant le schéma singleton, propose une méthode `getInstance()` qui fournit l'instance avec laquelle travailler.

Chaque fois que je veux exécuter une requête, il faut que je fasse un `FirebaseFirestore::getInstance()->maRequete()`, c'est comme ça que ça marche.

Toutefois, je voulais appeler une seule fois le `getInstance()` (bien que ça n'ait aucun intérêt en fait) et ainsi ranger ça dans une classe, en tant qu'attribut de classe `static`.

Sauf qu'un gars qui s'y connaît a dit à un mec qui voulait faire la même chose que moi, qu'il ne faut surtout pas faire ça. Voici ses explications :

Do not place Android context classes in static fields. Static reference to FirebaseFirestore which has field context pointing to Context will lead to a memory leak.

A static field will leak contexts. Non-static inner classes have an implicit reference to their outer class. If that outer class is for example a Fragment or Activity, then this reference means that the long-running handler/loader/task will hold a reference to the activity which prevents it from getting garbage collected.

So instead of storing it as a static variable call getInstance() whenever is needed.

Sauf que je ne comprends pas ce qu'il dit (pas un problème de traduction, c'est juste que techniquement je suis perdu). Quelqu'un pourrait-il reformuler svp ?

godrik godrik
MP
Niveau 22
17 février 2019 à 19:06:22

En java, la memoire associe a un objet est desallouer quand l'objet n'est plus accessible par le garbage collector.
Ici, ce que le mec dit est que si tu a une variable static vers ton objet firebase, l'objet restera accessible pour toute la vie de l'application et ne sera donc pas desalloue. Cet objet a des references vers plein de truc dans l'appli, dont l'Activity de android. Donc cette activity va rester accessible (indirectement) et tout ce que l'Activity touche reste accessible aussi. Et ca c'est probablement l'appli entiere.

Donc ce que le mec dit est qu'en ayant la variable statique, tu empeches le garbage collector de faire son travail et donc tu as en pratique une fuite de memoire.

itsdeft itsdeft
MP
Niveau 6
17 février 2019 à 21:46:23

Un attribut static n'est pas désalloué par le garbage collector
Donc toutes les données exploitées par ta FirebaseFirestore resteront en mémoire sur le téléphone tout le temps de l'exécution de l'application

VivreUnEldorado VivreUnEldorado
MP
Niveau 15
19 février 2019 à 22:42:08

Merci à vous !

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment