View Full Version : java get/set
stefanino13
11-12-2011, 14:26
ragazzi è importante (domani è la verifica e non li ho capiti) fin'ora non ho mai avuto problemi in programmazzione.. fino agli oggetti in java li so fare, una class con il main e una (o più) con i metodi.. mi potete spiegare come si usano/dove si mettono/come si scrivono i metodi set e jet? spero nel vostro aiuto :help:
Un semplice esempio dovrebbe bastare. Se non ti è chiaro qualcosa domanda.
public class Main {
public static void main(String[] args) {
Persona p1 = new Persona("tizio", 15);
System.out.println(p1);
System.out.println("anni: " + p1.getAnni());
p1.setAnni(20);
System.out.println(p1);
System.out.println("anni: " + p1.getAnni());
}
}
public class Persona {
private String nome;
private int anni;
public Persona(String nome, int anni) {
this.nome = nome;
this.anni = anni;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getNome() {
return this.nome;
}
public void setAnni(int anni) {
this.anni = anni;
}
public int getAnni() {
return this.anni;
}
public String toString() {
return this.nome + "|" + this.anni;
}
}
Output
tizio|15
anni: 15
tizio|20
anni: 20
wingman87
11-12-2011, 14:56
I metodi get e set servono al tempo stesso a nascondere l'implementazione interna e a preservare uno stato di consistenza dei dati.
Nei casi più semplici il primo punto non è evidente e ci si concentra di più sul secondo.
Ti faccio un esempio classico e semplice:
class NumeroRazionale{
private int numeratore;
private int denominatore;
public NumeroRazionale(){
numeratore = 1;
denominatore = 1;
}
public void setNumeratore(int numeratore){
this.numeratore = numeratore;
}
public void setDenominatore(int denominatore){
if(denominatore == 0) throw new IllegalArgumentException("denominatore deve essere diverso da 0");
this.denominatore = denominatore;
}
public int getNumeratore(){ return numeratore; }
public int getDenominatore(){ return denominatore; }
...
}
Quasi tutti i set e get non fanno altro che settare o restituire il valore della rappresentazione interna, però setDenominatore aggiunge anche un controllo sulla validità del dato, impedendo di raggiungere uno stato di inconsistenza.
Sul nascondere l'implementazione interna ti faccio un altro esempio, un rettangolo in un piano cartesiano:
class Rectangle{
float left;
float bottom;
float width;
float height;
public Rectangle(float width, float height){
if(height <= 0 || width <= 0)
throw new IllegalArgumentException("height and width must be positive");
this.left = this.bottom = 0;
this.width = width;
this.height = height;
}
public void setCenter(int x, int y){
this.left = x - this.width / 2;
this.bottom = y - this.height / 2;
}
...
}
In questo esempio vedi che, anche se tramite il metodo set viene settato il centro, internamente quello che cambia è la posizione left/bottom del rettangolo. D'altra parte il centro può essere sempre ricalcolato, quindi potresti scrivere anche un metodo getCenter:
public Point getCenter(){
return new Point(this.left + this.width / 2, this.bottom + this.height / 2);
}
stefanino13
11-12-2011, 18:24
ok ragazzi molto più chiaro.. in poche parole già li facevo sti passaggi inventanto un nome io al metodo invece che usare set e get.. grazie mille per la spiegazione a tutti a due :D
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.