Quando si utilizza il getInstance () metodo della classe java.text.NumberFormat astratta, che cosa è la classe reale del valore di ritorno?

StackOverflow https://stackoverflow.com/questions/2850654

Domanda

Questa domanda si espande su quella a astratto-classe NumberFormat-very- confuso-about-getInstance . Credo che questa domanda è abbastanza diversa da meritare di essere chiesto da solo.

Nelle risposte a questa domanda, è stato affermato che una dichiarazione codice come

NumberFormat en = NumberFormat.getInstance(Locale.US);

restituisce un oggetto che è una sottoclasse della classe java.text.NumberFormat. Ha senso per me il motivo per cui il tipo di ritorno non può essere solo un'istanza di NumberFormat dal momento che è una classe astratta. Piuttosto, è stato affermato che l'oggetto restituito è almeno un'istanza di NumberFormat, ma in realtà qualcosa di diverso.

La mia domanda è questa: che cosa specificamente è la classe dell'oggetto che viene restituito? Nella documentazione Sun gli unici sottoclassi che vedo sono ChoicesFormat e DecimalFormat. C'è una sorta di dietro le quinte del compilatore voodoo succedendo qui?

Grazie in anticipo!

È stato utile?

Soluzione

Il tipo specifico non è specificato, perché può essere qualsiasi sottoclasse di NumberFormat. Si potrebbe anche dipendere dal locale si usa. Alcuni locali possono richiedere un ChoiceFormat per implementare correttamente, per gli altri DecimalFormat è sufficiente e per un terzo locale che potrebbe anche tornare un'implementazione specifica locale.

Il fatto che non è definito più precisamente rispetto alla classe base astratta permette questo tipo di cambiamento nell'implementazione senza dover cambiare la firma del metodo per accogliere un tale cambiamento.

Si può facilmente verificare quale tipo concreto viene restituito dal una chiamata specifica chiamando getClass() sul valore restituito.

Altri suggerimenti

Questo è un esempio di modello di fabbrica.

I progettisti API non ha voluto richiedere al chiamante di conoscere il sottotipo concreto di NumberFormat. Se il chiamante "cure" quali classi in oggetto possono essere restituiti Male Cose come l'operatore instanceof iniziano ad apparire. Quando cose del genere accade, tutto il tratto il chiamante è "strettamente legato" alla sottoclasse concreta e non solo l ' "interfaccia" (dove l'interfaccia può significare un'interfaccia Java, classe astratta o anche qualche altra classe non definitivo).

La maggior parte dei sostenitori OO vogliono di effettuare riprese per "alta incapsulamento, loose coupling".

Perché non correre ...

System.out.println(NumberFormat.getInstance(Locale.US).getClass().getName());

... e scoprire?

Uso della href="http://www.beanshell.org" rel="nofollow noreferrer"> Beanshell console Jedit , ottengo il seguente:

BeanShell> import java.text.NumberFormat;
BeanShell> NumberFormat en = NumberFormat.getInstance(Locale.US);
BeanShell> en.getClass().getName();
java.text.DecimalFormat

direi che DecimalFormat viene restituito da questa chiamata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top