POO-ITBA / 2024_01

Consultas 1C 2024
0 stars 0 forks source link

Recuperatorio 2021 1C - Ejercicio 3 #30

Closed lmoliveto closed 2 months ago

lmoliveto commented 2 months ago

Buenas tardes! Queria saber si serian correctas las siguientes implementaciones del enum Amenity.

OPCION 1:


public enum Amenity{
    CLEANING(300),
    FUMIGATION(100),
    POOL(200){
        @Override
        public int getPrice(int rooms){
            return price;
        }
    };

    private final int price;

    Amenity(int price){
        this.price = price;
    }

    public int getPrice(int rooms){
        return price * rooms;
    }
}

OPCION 2:


public enum Amenity{
    CLEANING(300, true),
    FUMIGATION(100, true),
    POOL(200, false);

    private final int price;
    private final boolean perRoom;

    Amenity(int price, boolean perRoom){
        this.price = price;
        this.perRoom = perRoom;
    }

    public int getPrice(int rooms){
        return price * (perRoom ? rooms : 1);
    }
}

Tambien si estaria mal calcular el costo de las amenities en la clase Building con el siguiente metodo:


 public double calculateAmenitiesCost(int rooms){
       double toReturn = 0;
       for(Amenity a : amenities){
           toReturn += a.getPrice(rooms);
       }
       return toReturn;
   }

Y dos ultimas dudas, mas generales:

  1. Una clase puede ser abstracta, tener constructor y ningun metodo abstracto? De ser asi, seria abstracta solo para no poder instanciarla?
  2. Para poder hacer for each sobre algo tengo que chequear que no sea null?
fmeola commented 2 months ago

Hola @lmoliveto La opción 1 está perfecta La opción 2 termina quedando imperativa con el condicional, no está mal pero la 1 está mejor.

Me gusta más tu solución de calcular el costo de las amenities en la clase Building (que es la dueña del arreglo) que la que publicamos nosotros donde el cálculo se hace en FunctionalUnit. Muy bien.

  1. Sí, podés tener una clase abstracta sólo con el constructor, te sirve para no repetir código del constructor en las clases hijas porque seguro podrás asignar las variables de instancia que declaraste en la clase abstracta.
  2. Sí tenés que asegurarte que no sea null sino podés obtener NullPointerException