Quali sono i vantaggi degli oggetti associati di Scala rispetto ai metodi statici?


50

Scala non ha parole chiave statiche , ma ha invece funzionalità simili tramite oggetti associati. Dietro le quinte gli oggetti associati sono compilati in classi che hanno metodi statici, quindi tutto questo è zucchero sintattico. Quali sono i vantaggi di questa scelta progettuale? Svantaggi? Altre lingue hanno costrutti simili?


Risposte:


49

Ecco alcuni motivi, che potrebbero essere più o meno interessanti per te, a seconda delle tue preferenze:

  1. Non semplicemente scartarlo per essere "zucchero sintattico". Mentre puoi dire che qualcosa è solo zucchero sintattico, è dopo tutto lo zucchero che addolcisce la tua vita - come programmatore così come un bevitore di tè o caffè.

  2. Singletons: ogni Scala objectè intrinsecamente un singleton. Considerando che nel mondo Java le persone stanno implementando i singoli in vari modi e il più delle volte finiscono per fare qualche errore nella loro implementazione, non è possibile commettere un errore così semplice come in Scala. Scrivere objectinvece di classrenderlo un singleton e il gioco è fatto.

  3. Accesso ai metodi statici: è possibile accedere ai metodi statici in Java dagli oggetti. Ad esempio, supponiamo di avere una classe Ccon un metodo statico fe un oggetto cdi tipo C. Quindi dovresti chiamare C.f, ma Java ti consente (anche se con un avvertimento) di usare c.f, che quando arrivi dallo sfondo di Scala non ha davvero senso, perché gli oggetti non hanno un metodo f.

  4. Separazione chiara: in Java è possibile combinare attributi e metodi statici e non statici in una classe. Se lavori disciplinato, questo non diventa un problema, tuttavia, se tu (o qualcun altro per quella materia) non lo fai, allora finisci con parti statiche e non statiche interlacciate ed è difficile dirlo a colpo d'occhio cos'è statico e cosa no. In Scala, tutto ciò che si trova all'interno dell'oggetto associato chiaramente non fa parte degli oggetti runtime della classe corrispondente, ma è disponibile da un contesto statico. Viceversa, se è scritto all'interno di una classe, è disponibile per le istanze di quella classe, ma non da un contesto statico. Questo diventa particolarmente oneroso in Java, una volta che inizi ad aggiungere blocchi di inizializzatori statici e non statici alla tua classe. Questo può essere molto difficile da comprendere in termini di ordine di esecuzione dinamico.

  5. Meno codice: non è necessario aggiungere la parola statica a ogni singolo attributo o metodo in un object, mantenendo così il codice più conciso (anzi, non un vantaggio rilevante in realtà).

Gli svantaggi sono molto più difficili da trovare. Si potrebbe obiettare che le parti statiche e non statiche dovrebbero appartenere insieme, ma sono separate dal concetto di Scala di oggetti associati. Ad esempio, può sembrare strano avere un diagramma di classe, ma alla fine bisogna creare due cose nel codice e sezionare quale attributo va dove.


1
Ho anche letto che la statica non appartiene a un software OOP puro. Ad esempio, quando è necessario un comportamento statico, utilizzare una propria classe e crearne uno (singleton), che gestisca il comportamento (potenzialmente) statico degli oggetti di un'altra classe.
K ..

1
"Scrivere un oggetto al posto della classe lo rende un singleton e il gioco è fatto." Non mi importa molto dei Singleton, ma devo ammettere che la direttività di questo particolare "zucchero sintattico" ha un certo fascino.
Ed Hastings,

3
Nessuno dei punti da 1 a 5 (e anche tutti insieme) necessita di un vero oggetto compagno in fase di esecuzione per essere implementato. Tutti possono essere facilmente trasformati in puro zucchero sintattico, senza impatto sull'autonomia. L'unica vera ragione per avere un oggetto compagno di runtime è data nella risposta di Alexey Romanov.
mas.morozov,

"Gli svantaggi sono molto più difficili da trovare." Prestazione? l'accesso a un metodo oggetto genera un ifnonnullbytecode ecc. rispetto a semplicemente invokeStatic.
Eduardo Pareja Tobes,

33

Un altro vantaggio è che objects può implementare interfacce / tratti, a differenza dei metodi statici.


8
Penso che questa sia la principale differenza tra un oggetto compagno e una classe con metodi statici. Un oggetto associato è polimorfico e può essere passato come argomento ai metodi che prevedono un'interfaccia / tratto.
dcastro,

4

Gli oggetti companion sono il primo posto cercato per impliciti, dopodiché scala guarda Predef e quindi in istruzioni esplicite di "importazione" in quel particolare file sorgente.

Non sono abbastanza sviluppatore java per sapere se il linguaggio java o le librerie forniscono meccanismi comparabili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.