2015-05-13 18 views
5

Ho un Point. Sto cercando di ottenere x come int. Se uso Point.x, mi metterò x come int. Ma ho l'impressione che dovrei usare un getter quando possibile (Why use getters and setters?). Il problema con Point.getX() è che restituisce un doppio anziché un int.Devo usare Point.x o Point.getX()?

Che è meglio, o è solo la preferenza?

a o b?

Point point = new Point(5, 5); 
int a = point.x; 
int b = (int) point.getX(); 

Ho letto Java Point, difference between getX() and point.x, ma non ho davvero rispondere alla mia domanda. O almeno non ho capito la risposta.

+2

Io uso 'point.x'. Non è * il tuo * difetto che il punto sia rotto. :-) Non è che il tuo codice si evolverà per funzionare con un tipo sub/super di Point. – aioobe

risposta

2

Le funzioni getX() e getY() della classe Point restituiscono un doppio perché è quello che richiede la classe genitore (Point2D). Questo è così tutte le sue sottoclassi (Point2D.Double e Point2D.Float) tutto il lavoro negli stessi luoghi.

Utilizzando point.x e point.y direttamente invece di utilizzare le funzioni getter è probabilmente bene in questo caso, dal momento che la classe Point è un caso angolo strano che nessuno sembra amore- maggior parte della gente pensa che dovrebbe essere immutabili, o almeno meglio nascondere i suoi valori.

Se hai paura di qualcosa come una revisione del codice, basta inserire un commento lì spiegando perché stai accedendo direttamente alle variabili x e y.

tl; dr: si tratta solo di preferenze personali.

1

credo, insomma, che i progettisti di questa classe non volevano creare un altro paio di funzioni getXAsInteger e getYAsInteger, ma ancora vi darà la possibilità di ottenere i valori interi sottostanti, al posto dei valori convertiti per raddoppiare . Quindi fai un'eccezione in quel caso e usa direttamente i campi.

1

Come il tipo restituito double dei metodi getter della classe punto è solo per renderlo compatibile tramite l'ereditarietà e lo getX() non eseguire nulla senza solo restituire valore.

SO, il suo solo circa la vostra preferenza, immagino.
Ma come uso point.x (perché fare la conversione inutile?) In questo caso solo, Anche se io preferisco usare getter/setter sempre.

0

Come già indicato in altre risposte: La gerarchia di ereditarietà di Point2D è ... un po 'insolita. La ragione di ciò è semplice:

Dalla documentazione di Point:

Un punto rappresenta una posizione (x, y) di coordinate spazio, specificato in precisione intero.

Da: 1.0

Dalla documentazione di Point2D:

La classe Point2D definisce un punto rappresenta una posizione (x, y) di coordinate spazio.

dal: 1,2

In poche parole: La classe Point esisteva fin dall'inizio del tempo, e la classe Point2D è stato introdotto in seguito. La classe Point è stata quindi "adattata" per essere anche Point2D e offrire i metodi getX(), ad esempio.


Quando si lavora con Point, e con dedizione solo con Point, e si sempre e solo vogliono trattare con int coordinate, quindi è possibile utilizzare point.x di accedere direttamente al campo.

In caso contrario, quando le doppie coordinate hanno senso per il caso di applicazione e si desidera, ad esempio, un metodo che riceve un "punto" come parametro, di solito si dovrebbe considerare l'uso della classe Point2D astratta, perché è possibile passare a Point, a Point2D.Double oa un'istanza Point2D.Float a questo metodo.