0
votes

Comment incrémenter automatiquement un champ de ma classe lorsque je déclare et initialiser un objet de la classe?

J'ai 3 cours dans mon application Java, un représentant une politique médicale: xxx

une autre classe qui représente la stratégie motrice: xxx < p> et la 3ème classe contient la méthode principale () .

Chaque fois que je déclare et initialiser un objet de stratégie médicale dans mon principal () i Vous voulez le ID de la stratégie médicale d'incrémentation de 1, le même pour la stratégie motrice, c'est-à-dire si je déclare 2 objets de politique médicale dans mon principal () je veux la valeur de la 1ère politique médicale d'avoir le ID égal à 1 et la 2e politique médicale à avoir la valeur SET défini sur 2, et si je déclare 3 politique moteur, je Voulez-vous que le 1er ait ID égal à 1, la 2e's ID égal à 2 et le 3ème ID égal à 3.

Comment puis-je accomplir ça?

PS: Il n'y a pas de problème si je dois le régler / l'initialiser du constructeur, ce qui est important, c'est que je ne devrais pas passer la valeur de constructeur en tant que paramètre constructeur. < / p>


3 commentaires

Dans les deux classes: Déclarez un Statique privé Statique AtomicInteger Comptoir = Nouveau atomicinteger (); , appel comptoir.getandinCrement (); dans le constructeur.


@ Turing85 Pourquoi devrait-il être final? Ne veut pas dire que cela ne peut pas être changé?


Non, final signifie que la référence ne peut pas être réaffectée. Sa sémantique est différente de const en C / C ++


4 Réponses :


-1
votes

Pourriez-vous ne pas créer une liste, puis chaque objet de cette classe serait associé à son emplacement d'incrémentation de l'indice. par exemple. ListName.get (Obj Num-1) Depuis que le premier objet sera stocké à l'index de 0. Aussi listName.Size () renvoie une valeur afin que vous puissiez suivre combien vous avez eu.


1 commentaires

Si vous détenez des références à toutes les instances d'une classe, jamais créée, vous écrivez essentiellement la version Java d'une fuite de mémoire. Compte tenu de suffisamment de temps (et suffisamment d'invocations de constructeur de cette classe), le programme s'éteindra avec un OutofMemoryException .



0
votes

Utilisez un statique privé Int code> comme une variable d'instance

à l'intérieur du constructeur, vous définissez l'ID sur la série et ajoutez-en une à la série. P>

public class MedicalPolicy implements PolicyType {
    private static int serial = 1;
    private int id;
    // and some other fields

    public MedicalPolicy(final LocalDate effective,
                         final LocalDate expiry,
                         final ArrayList<Beneficiary> beneficiaries){
      this.id = serial++;
      // Other constructor stuff
    }
}


0 commentaires

2
votes

Comme je l'ai suggéré dans mon commentaire, j'ajouterais un atomicinteger pour compter le nombre d'appels de constructeur: xxx

la raison de l'utilisation de Un atomicinteger est la sécurité de thread-sécurité.

Avis, cependant, que cette implémentation ne compte que la fréquence à laquelle le constructeur a été appelé. Pour obtenir un nombre d'instances accessibles d'une classe donnée, il y a deux solutions à mon avis. On consiste à remplacer finaliser () (qui est obsolète en Java 13). L'autre utilise une liste de PHANTOMReference s pour suivre les instances accessibles.


2 commentaires

Pour être honnête, je n'ai pas compris ce que vous entendez par "instances accessibles", pour pouvoir initialiser une instance d'une classe (non statique), je dois utiliser un constructeur.


Java a un collecteur à ordures. Le collecteur des ordures déterminera lorsque des objets ne sont plus nécessaires et les destory. Ce compteur n'est pas capable de "voir" lorsque des objets sont détruits.