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
Cotxe
amb els atributs privatsmarca
,model
iany
. Implementa els getters i setters per a cada atribut. Afegeix un mètode per mostrar la informació del cotxe. -
Exercici 2: Modifica la classe
Persona
per afegir un atribut privatadreça
. Implementa els getters i setters per a aquest atribut i actualitza el mètodemostrarInformacio
per 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