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ó

  1. Control d'Accés: Permet controlar com es modifiquen els atributs d'un objecte.
  2. Protecció de Dades: Evita que les dades es modifiquin de manera no desitjada o incorrecta.
  3. Facilitat de Manteniment: Facilita la modificació del codi sense afectar altres parts del programa.
  4. 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.

public class Persona {
    private String nom;
    private int edat;
}

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

  1. Exercici 1: Crea una classe Cotxe amb els atributs privats marca, model i any. Implementa els getters i setters per a cada atribut. Afegeix un mètode per mostrar la informació del cotxe.

  2. Exercici 2: Modifica la classe Persona per afegir un atribut privat adreça. Implementa els getters i setters per a aquest atribut i actualitza el mètode mostrarInformacio 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

Mòdul 2: Flux de Control

Mòdul 3: Programació Orientada a Objectes

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

Mòdul 8: Multithreading i Concurrència

Mòdul 9: Xarxes

Mòdul 10: Temes Avançats

Mòdul 11: Frameworks i Llibreries de Java

Mòdul 12: Construcció d'Aplicacions del Món Real

© Copyright 2024. Tots els drets reservats