web-dev-qa-db-fra.com

Java statique vs instance

Donc, mon ami codeur déteste utiliser le codage static. Pourtant, mon programme Java en est plein pour faire le lien entre les classes et j'en ai beaucoup!

Vaut-il la peine de réécrire tout le code pour supprimer la méthode statique?

Y a-t-il un avantage à utiliser l'un par rapport à l'autre?

22
Kezz101

1. Une variable d'instance est un par objet, chaque objet a son copie propre de la variable d'instance.

Par exemple:

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();

t1 et t2 seront tous deux {disposeront de leur propre copie)x.

2. Une variable statique est un par classe, chaque objet de cette classe partage la même variable statique.

Par exemple:

public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();

t1 et t2 auront le exactement un x à partager entre eux.

3. Une variable statique est initialisée lorsque la machine virtuelle Java charge la classe.

4. Une variable ou une méthode static methodne peut pas accéder Non-static.

_ {5.Static methods avec Static variables peut imiter un Singleton Pattern, mais CE N'EST PAS LA BONNE MANIÈRE, comme lorsqu'il y a beaucoup de classes, nous ne pouvons pas être sûr sur l'ordre de chargement des classes de la machine virtuelle Java, ce qui peut créer un problème.

37
Kumar Vivek Mitra

static est pour les cas où vous ne voulez pas avoir de copie pour chaque instance

Les variables instance concernent les cas où vous souhaitez une copie séparée pour chaque instance d'objet.

Basé sur des analyses de rentabilisation, lequel utiliser peut changer.

7
kosa

Si vous avez trop de fonctions statiques et de variables, cela peut conduire à une approche plus fonctionnelle plutôt qu’à une véritable OO. De plus, si vous avez une variable statique publique, vous répliquez une variable globale qui n'est pas bonne. Garder une trace d'eux est un cauchemar.

En règle générale, ma règle consiste à utiliser des variables d'instance si vous ne pouvez disposer de variables et de fonctions statiques que si elles sont génériques sur une classe plutôt que sur un objet.

C’est une bonne réponse à une question similaire Java: quand utiliser des méthodes statiques

Plutôt que de simplement relier des méthodes, envisagez d'utiliser la nouvelle opération pour créer un nouvel objet et accéder à la méthode de manière non statique.

avant

public void myMethod(){
    Time.setTime(Time.getTime() + 20);
    System.out.println(Time.getTime());
}

après

public void myMethod(){
    Time t = new Time();
    t.setTime(t.getTime() + 20);
    System.out.println(t.getTime());
}

Tout état qui est maintenu dans ces méthodes sera désormais l’instance de temps que vous avez créée. Vous pouvez également partager la variable t avec d'autres méthodes si vous en aviez besoin.

4
RNJ

Ramassage des ordures - les champs statiques vivent beaucoup plus longtemps que les champs d'instance. D'un point de vue logique, les champs statiques ne sont supposés être partagés qu'entre toutes les instances - si c'est vraiment votre cas, aucun problème bien entendu. 

3
Eugene

Instance et variable statique:

Réponse à votre question: Je dirais que cela vaut la peine d’utiliser une variable statique pour économiser l’allocation de mémoire.

Allocation de mémoire:

Pour variable statique un seul emplacement de la mémoire est alloué indépendamment d'un objet créé et pour Variable d'instance chaque objet d'un emplacement de mémoire alloué 

Maintenant, considérons cet exemple, considérons que vous travaillez sur un projet interne à une entreprise dans lequel vous devez créer un objet 1M pour Employee class et quelques propriétés de la classe Employee sont eid, ename, ecompany maintenant les employés travaillent dansXYZsociété donc valeur pour la propriété ecompany va être "XYZ" indépendamment de l'employé.

Maintenant que vous connaissez la situation, la valeur de la propriété ecompany va êtreXYZpour 1 Million Object. 

Maintenant, vous décidez que vous voulez déclarer ecomapny property en tant qu’instance statique ou en tenant compte de l’allocation de mémoire.

si vous le déclarez comme statique, la mémoire minimale allouée à ecompany ne sera que de 48 octets, ce qui est très inférieur à la mémoire nécessaire pour stocker 1 million de variables d’instance. 100000 * 48 octets = 48 millions d'octets.

1
user4408375

Parlez-vous de méthodes statiques ou de propriétés statiques?

En ce qui concerne les méthodes statiques, il n’ya qu’un moyen de les abuser, c’est lorsque vous définissez des méthodes qui prennent une instance d’objet en tant que paramètre. Vous ne devriez jamais avoir besoin de le faire et, à mon avis, c'est une mauvaise pratique de codage. Voici un exemple:

static int add(ThisClass a, ThisClass b) {
   return a.value + b.value;
}

Si vous parlez de variables statiques dans la classe, vous abordez essentiellement le sujet des "singletons", c’est-à-dire qu’il est prévu d’exister une seule instance d’une classe particulière. Les singletons sont soumis à de nombreux abus. Elles sont utilisées par de nombreuses bibliothèques de classes (pensez à JDNI et aux classes de journalisation), mais si une application les utilise beaucoup, cela peut être le signe d’un programme mal structuré. C’est probablement ce que votre ami crie.

1
AlanObject

Pro Static

Une fois qu'un membre statique est appelé de l'intérieur ou de l'extérieur de la classe, le constructeur statique de la classe est appelé. "L'objet statique" vivra toute la session, vous gagnerez donc en performance.

Con Static

Les membres statiques ne peuvent pas avoir d'états et ne peuvent donc pas parler à des membres non statiques de la classe.

Exemple

Si nous considérons la classe BigInteger , cette classe gagnerait si certaines parties ont été transformées en membres statiques. 

Une instance de la classe représente (comme prévu) un grand entier. 

Cependant, les méthodes principales d’addition et de multiplication ne sont pas statiques (ce qu’elles devraient être dans un monde meilleur), ce qui est mauvais pour la performance.

Par conséquent, dans la pratique, il ne faut pas avoir peur des mélanges entre statique et non statique. 

0
AD.

Je n'aime pas utiliser des variables ou des méthodes statiques car elles n'ont pas de véritable héritage. Cela rend plus difficile de se moquer pour les tests. L'utilisation d'instances vous donne la flexibilité d'un polymorphisme complet. Par contre, des variables statiques sont parfois nécessaires, par exemple avec un cache global. Les méthodes statiques peuvent présenter un avantage si elles fournissent des méthodes auxiliaires pour les classes/objets/primitives auxquelles vous ne pouvez pas accéder ni les étendre. Ces méthodes d'assistance sont si simples qu'elles ne nécessitent pas d'héritage. Par exemple, classe Java.util.Arrays ou Java.util.Collections.

0
Maarten

Lorsque vous utilisez des objets statiques (sauf dans le cas de singleton), vous implémentez une programmation fonctionnelle combinée à des variables globales. Si vous le faites souvent - vous devriez reconsidérer votre conception ou utiliser Java (vous devriez peut-être utiliser un langage de programmation fonctionnel tel que liste, schéma, etc.).

0
alfasin