35 votes

Pourquoi les objets singleton sont-ils plus orientés objet?

Dans Programming in Scala: Un guide complet étape par étape, l'auteur a déclaré:

Une façon dont Scala est plus orienté objet que Java est que les classes en Scala ne peuvent pas avoir de membres statiques. Au lieu de cela, Scala a des objets singletons.

Pourquoi un objet singleton est-il plus orienté objet? Quel est l'intérêt de ne pas utiliser de membres statiques, mais des objets singletons?

2voto

huynhjl Points 26045

Il est plus orienté objet dans le sens où, étant donné une classe Scala, chaque appel de méthode est un appel de méthode sur cet objet. En Java, les méthodes static ne interagissent pas avec l'état de l'objet.

En fait, étant donné un objet a d'une classe A avec la méthode static m(), il est considéré comme une mauvaise pratique d'appeler a.m(). Il est recommandé d'appeler A.m() à la place (Je crois qu'Eclipse vous donnera un avertissement). Les méthodes static Java ne peuvent pas être redéfinies, elles peuvent simplement être masquées par une autre méthode :

class A {
    public static void m() {
        System.out.println("m from A");
    }
}
public class B extends A {
    public static void m() {
        System.out.println("m from B");
    }
    public static void main(String[] args) {
        A a = new B();
        a.m();
    }
}

Qu'affichera a.m() ?

En Scala, vous mettriez les méthodes static dans les objets compagnons A et B et l'intention serait plus claire car vous vous référeriez explicitement au compagnon A ou B.

Ajoutant le même exemple en Scala :

class A
object A { 
  def m() = println("m from A") 
}
class B extends A
object B { 
  def m() = println("m from B")
  def main(args: Array[String]) {
    val a = new B
    A.m() // ne peut pas appeler a.m()
  }
}

-7voto

Charlie Martin Points 62306

C'est vraiment une question de marketing. Considérez deux exemples :

classe foo
   const int bar = 42;
fin de la classe

classe superfoo
    bar entier = ConstInteger.new(42);
fin de la classe

Maintenant, quels sont les différences observables ici ?

  • dans un langage bien comporté, le stockage supplémentaire créé est le même.
  • Foo.bar et Superfoo.bar ont exactement les mêmes signatures, accès, etc.
  • Superfoo.bar peut être alloué différemment mais c'est un détail d'implémentation

Cela me rappelle les guerres religieuses il y a 20 ans sur le fait de savoir si C++ ou Java étaient "vraiment" Orientés Objet, puisque après tout les deux exposent des types primitifs qui ne sont pas "vraiment" des objets - donc, par exemple, vous ne pouvez pas hériter de int mais pouvez hériter de Integer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X