les classes statiques en orienté objet

Le problème exposé dans ce sujet a été résolu.

Bonjour.

Pourquoi les classes statiques ne marchent pas?..

public static class Math {
    public double PI = 3.14;

    public double sqrt(double n) {
        return n**0.5;
    }
}

Une classe statique serait une classe où tous les membres et méthode serait statiques par défaut. Cela porte un autre nom ?

Pourquoi les packages ne servent pas à ça ? Quelle différence entre ta "classe statique" et des variables publiques dans un sous package ?

unidan
package myStaticTest;

public class MyStaticClass {
    
    public static double myStaticValue = 12.2;
    
    public static void changeMyStaticValue(double newValue) {
        MyStaticClass.myStaticValue = newValue;
    }
    
    public static void main(String[] args) {
        // Afficher la valeur statique
        System.out.println(MyStaticClass.myStaticValue);
        
        // La modifier
        MyStaticClass.changeMyStaticValue(5.33);
        
        // Ré-afficher
        System.out.print(MyStaticClass.myStaticValue);
    }
}

Comme tu le vois, je répète à chaque fois le mot clef static devant les membres et les méthodes, peut importe le package, j’aimerais éviter ça…

Salut !

Il me semble que tu es obligé de répéter statique pour tout les membres de ta classe

EDIT: https://stackoverflow.com/questions/7486012/static-classes-in-java

Vanadiae

ah merci, chouette exemple!

Comme le lien donné par Vanadiae le dit, Java ne permet pas la création de class statique.

Pourquoi ?

Tout simplement car une class est censé disposer d’attributs et de méthodes propre à une instance de la classe. En Java, l’unité élémentaire est la classe, ce qui rend impossible la définition d’attributs statiques au sein d’un package vu que cela doit nécessairement se trouver dans une classe.

Du coup, tu n’a pas vraiment le choix que de le spécifié à chaque fois.

Tu peux néamoins faire cela pour rendre le comportement le plus « statique » possible :

package myStaticTest;

// final pour empêcher la dérivation
public final class MyStaticClass {

    // constructeur privé pour empêcher l'instanciation
    private MyStaticClass() {}
    
    public static double myStaticValue = 12.2;
    
    public static void changeMyStaticValue(double newValue) {
        MyStaticClass.myStaticValue = newValue;
    }
    
    public static void main(String[] args) {
        // Afficher la valeur statique
        System.out.println(MyStaticClass.myStaticValue);
        
        // La modifier
        MyStaticClass.changeMyStaticValue(5.33);
        
        // Ré-afficher
        System.out.print(MyStaticClass.myStaticValue);
    }
}

PS: pense à mettre le sujet en résolu si c’est le cas ;)

+0 -0

Comme tu le vois, je répète à chaque fois le mot clef static devant les membres et les méthodes, peut importe le package, j’aimerais éviter ça…

marius007

En fait si t’as juste besoin d’un peu de sucre, tu peux utiliser Lombok, tu auras ton résultat juste en utilisant une annotation :

import lombok.experimental.UtilityClass;

@UtilityClass
public class Example { // la classe sera final avec un constructeur private

    int willBeStatic;

    void iAmActuallyStatic() {}
}

https://projectlombok.org/features/experimental/UtilityClass

+1 -0

Pourquoi les classes statiques ne marchent pas?.. Une classe statique serait une classe où tous les membres et méthode seraient statiques par défaut. Cela porte un autre nom ?

  1. Les classes statiques marchent très bien, pour autant que les classes veuillent bien marcher avec leurs petites pattes.
  2. Elles n’ont strictement rien à voir avec les méthodes et champs statiques.

En java, il y a des mots clés qui ont plusieurs usages : par exemple final et static.

Le mot clé final,

  • pour un champ, ça veut dire qu’il ne peut pas être modifié au delà du constructeur ;
  • pour une méthode, ça veut dire qu’elle ne peut pas être redéfinie dans une sous-classe,
  • et pour une classe, qu’on ne peut pas en dériver d’autres classes.

Pour static maintenant :

  • Pour un champ x dans une classe Truc, static veut dire que ce ce n’est pas un attribut propre à chaque instance de Truc, mais une donnée de la classe.

  • pareil pour une méthode, elle ne s’applique pas à une instance

  • pour une classe, c’est tout autre chose. ça sert pour définir une classe B interne à une autre classe A, dont les instances ne sont pas liées à une instance de B. Essentiellement, une classe interne statique, ça évite simplement d’avoir un code source séparé pour des bricoles qui ne servent qu’à l’intérieur d’une classe unique.

class  Plan {
    static class Position {
        double x, y;
    }
    private ArrayList<Position> villes;
    ...
}

et ça n’a strictement rien à voir avec le caractère statique ou non de ce qu’il y a dans la classe interne.

J’aime pas mettre le mot clé static partout

  • Tu dois le mettre là où il y en a besoin
  • et pas ailleurs. Ca ne se fait pas au pif, il faut réfléchir.
  • si ton problème est que tu n’aimes pas ça, la solution est d’arrêter d’aimer ou pas aimer.
+0 -0

Bonjour pour info j’ai trouvé une classe statique dans un fichier java:

static class Cell {  
        int heuristicCost = 0; //Heuristic cost
        int finalCost = 0; //G+H
        int i, j;
        Cell parent; 

        Cell(int i, int j){
            this.i = i;
            this.j = j; 
        }

        @Override
        public String toString(){
            return "["+this.i+", "+this.j+"]";
        }
    }

Mais peut-être que le mot clef static est utilisé pour une autre raison ici ?

Une autre raison que quoi ?

Dans la classe Cell, le code ne fait aucune référence aux éléments de la classe qui la contient. Elle n’a aucune raison d’être autre chose que static. Même situation que la classe Position ci-dessus

  • La méthode toString serait mieux sous la forme
return String.format("[%d, %d]", i, j);

Ces bricolages à coup de concaténations et de conversions implicites, c’est illisible.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte