Introducció a l'Encapsulació
L'encapsulació és un dels quatre pilars de la Programació Orientada a Objectes (POO), juntament amb l'herència, el polimorfisme i l'abstracció. L'encapsulació es refereix a la pràctica de restringir l'accés directe a algunes de les dades d'un objecte i només permetre la seva modificació a través de mètodes públics. Això ajuda a protegir la integritat de les dades i a mantenir el control sobre com es manipulen.
Conceptes Clau
- Classes i Objectes: Les classes defineixen l'estructura i el comportament dels objectes. Els objectes són instàncies de classes.
- Atributs Privats: Els atributs d'una classe es poden declarar com a privats per evitar l'accés directe des de fora de la classe.
- Mètodes Públics: Els mètodes públics s'utilitzen per accedir i modificar els atributs privats de manera controlada.
Beneficis de l'Encapsulació
- Control d'Accés: Permet controlar com es modifiquen els atributs d'un objecte.
- Protecció de Dades: Evita que les dades es modifiquin de manera no desitjada o incorrecta.
- Facilitat de Manteniment: Facilita la modificació del codi sense afectar altres parts del programa.
- Reutilització de Codi: Permet reutilitzar codi de manera més segura i eficient.
Implementació de l'Encapsulació en Java
Declaració d'Atributs Privats
Els atributs d'una classe es declaren com a privats utilitzant la paraula clau private.
Creació de Mètodes Públics (Getters i Setters)
Els mètodes públics, coneguts com a getters i setters, s'utilitzen per accedir i modificar els atributs privats.
public class Persona {
private String nom;
private int edat;
// Getter per a l'atribut nom
public String getNom() {
return nom;
}
// Setter per a l'atribut nom
public void setNom(String nom) {
this.nom = nom;
}
// Getter per a l'atribut edat
public int getEdat() {
return edat;
}
// Setter per a l'atribut edat
public void setEdat(int edat) {
if (edat > 0) { // Validació simple
this.edat = edat;
}
}
}Exemple Pràctic
A continuació, es mostra un exemple complet d'una classe Persona amb encapsulació:
public class Persona {
private String nom;
private int edat;
// Constructor
public Persona(String nom, int edat) {
this.nom = nom;
this.setEdat(edat); // Utilitzem el setter per aplicar la validació
}
// Getter per a l'atribut nom
public String getNom() {
return nom;
}
// Setter per a l'atribut nom
public void setNom(String nom) {
this.nom = nom;
}
// Getter per a l'atribut edat
public int getEdat() {
return edat;
}
// Setter per a l'atribut edat
public void setEdat(int edat) {
if (edat > 0) { // Validació simple
this.edat = edat;
}
}
// Mètode per mostrar la informació de la persona
public void mostrarInformacio() {
System.out.println("Nom: " + nom + ", Edat: " + edat);
}
public static void main(String[] args) {
Persona persona = new Persona("Joan", 25);
persona.mostrarInformacio();
persona.setEdat(30);
persona.mostrarInformacio();
}
}Exercicis Pràctics
-
Exercici 1: Crea una classe
Cotxeamb els atributs privatsmarca,modeliany. Implementa els getters i setters per a cada atribut. Afegeix un mètode per mostrar la informació del cotxe. -
Exercici 2: Modifica la classe
Personaper afegir un atribut privatadreça. Implementa els getters i setters per a aquest atribut i actualitza el mètodemostrarInformacioper incloure l'adreça.
Solucions
Solució Exercici 1
public class Cotxe {
private String marca;
private String model;
private int any;
// Getters i Setters
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getAny() {
return any;
}
public void setAny(int any) {
if (any > 1885) { // Validació simple
this.any = any;
}
}
// Mètode per mostrar la informació del cotxe
public void mostrarInformacio() {
System.out.println("Marca: " + marca + ", Model: " + model + ", Any: " + any);
}
public static void main(String[] args) {
Cotxe cotxe = new Cotxe();
cotxe.setMarca("Toyota");
cotxe.setModel("Corolla");
cotxe.setAny(2020);
cotxe.mostrarInformacio();
}
}Solució Exercici 2
public class Persona {
private String nom;
private int edat;
private String adreça;
// Constructor
public Persona(String nom, int edat, String adreça) {
this.nom = nom;
this.setEdat(edat); // Utilitzem el setter per aplicar la validació
this.adreça = adreça;
}
// Getters i Setters
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public int getEdat() {
return edat;
}
public void setEdat(int edat) {
if (edat > 0) { // Validació simple
this.edat = edat;
}
}
public String getAdreça() {
return adreça;
}
public void setAdreça(String adreça) {
this.adreça = adreça;
}
// Mètode per mostrar la informació de la persona
public void mostrarInformacio() {
System.out.println("Nom: " + nom + ", Edat: " + edat + ", Adreça: " + adreça);
}
public static void main(String[] args) {
Persona persona = new Persona("Joan", 25, "Carrer Major, 1");
persona.mostrarInformacio();
persona.setEdat(30);
persona.setAdreça("Carrer Nou, 2");
persona.mostrarInformacio();
}
}Conclusió
L'encapsulació és una tècnica fonamental en la programació orientada a objectes que ajuda a protegir les dades i a mantenir el control sobre com es manipulen. Mitjançant l'ús d'atributs privats i mètodes públics (getters i setters), podem assegurar-nos que les dades es gestionen de manera segura i coherent. Aquesta pràctica no només millora la seguretat del codi, sinó que també facilita el manteniment i la reutilització del mateix.
Curs de Programació en Java
Mòdul 1: Introducció a Java
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
Mòdul 4: Programació Orientada a Objectes Avançada
Mòdul 5: Estructures de Dades i Col·leccions
Mòdul 6: Gestió d'Excepcions
Mòdul 7: Entrada/Sortida de Fitxers
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection
