Domanda

Io uso il Scanner classe per la lettura di file multipli simili. Vorrei estenderlo a fare in modo che tutto l'uso la stessa delimitatore e posso anche aggiungere metodi come skipUntilYouFind (String questoqui) che tutti validi per tutti loro.

posso fare un programma di utilità di classe che li contengono, o incorporare la Classe scanner come una variabile all'interno di un'altra classe, ma questo è più ingombrante.

Ho trovato alcuni motivi per dichiarare una classe finale, ma il motivo per cui si fa qui?

È stato utile?

Soluzione

Probabilmente perché estendendola e sovrascrivere alcuni dei suoi metodi probabilmente romperlo. E rendendo più facile per i metodi di sovrascrittura sarebbe esporre a gran parte dei meccanismi interni, quindi se in futuro si decide di cambiare quelle (per le prestazioni o altri motivi), che sarebbe stato più difficile per loro di cambiare la classe senza rompere tutte le classi che estenderlo.

Per esempio, si consideri il seguente metodo nella classe:

public boolean nextBoolean()  {
    clearCaches();
    return Boolean.parseBoolean(next(boolPattern()));
}

Dire che si desidera sovrascrivere questo perché si vuole fare 'impressionante' restituire un valore booleano 'vero' (per qualsiasi motivo). Se si sovrascrive, non è possibile chiamare super.nextBoolean (), dal momento che sarebbe consumare il token successivo utilizzando la logica predefinita. Ma se non si chiama super.nextBoolean (), non saranno chiamati clearCaches (), possibilmente rompendo gli altri metodi non sovrascritti. Non è possibile chiamare clearCaches () perché è privata. Se l'hanno fatta protetto, ma poi si rese conto che sta causando un problema di prestazioni, e voleva una nuova implementazione che fa le cache non è chiaro più, poi si potrebbe rompere il vostro implementazione sovrascritta che sarebbe ancora chiamando questo.

Quindi, in pratica si tratta di modo che possano facilmente cambiare le parti nascoste all'interno della classe, che sono piuttosto complessi, e vi protegge dal fare una classe figlia rotto (o di una classe che potrebbe essere essere facilmente rotto).

Altri suggerimenti

Suppongo che sia per motivi di sicurezza. Questa classe legge l'input dell'utente, in modo che qualcuno con cattive intenzioni potrebbe estendere, modificarlo di comportamento e sareste avvitato. Se è definitiva, non è così facile per il cattivo, perché se fa il suo proprio tipo di scanner (non java.util.Scanner), i principi del polimorfismo sarebbero rotti. Vedere il cattivo può essere abbastanza intelligente per scrivere un bot / script che fa questo automaticamente su server remoti ... Egli può anche fare da classloading dinamica applicazione compilata.

Credo che il link che hai fornito spiega tutto.

Nel tuo caso sembra che si dovrebbe preferire la composizione, invece di eredità in ogni caso. Si sta creando un programma di utilità che ha un comportamento predefinito, e che può nascondere alcuni (o tutti) i dettagli della classe Scanner.

Ho visto molte implementazioni che usato eredità al fine di modificare un comportamento. Il risultato finale è stato di solito un design monolitico, e in alcuni casi, un contratto rotto, e / o comportamenti rotto.

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