¿Puedo tener operaciones aritméticas en la inicialización?

CorePress2024-01-24  11

public class Pot {
    public String shape;
    private int capacity;
    public ArrayList<Flower> flowers = new ArrayList<Flower>();
    public int free_space = capacity - flowers.size(); // why doesn't free_space work?

    public Pot(String shape, int capacity) {
        this.shape = shape;
        this.capacity = capacity;
        System.out.println(capacity); // test
        System.out.println(flowers.size()); // test
        System.out.println(free_space); //test
    }
    
    ....
}

Hola, ¿por qué no puedo obtener el espacio_libre correcto? Siempre es 0. Descubrí que free_space = capacidad - flores.size() no funciona.

si nos gusta:


public static void main(String[] args) {
            Pot p = new Pot("square", 8);
            Flower f = new Flower(....);
            .....
            Flower f6 = new Flower(....);
            p.insert(f);
            .....
            p.insert(f6);
}

Se supone que son las 8.



------------------------------------

free_space depende de otros dos parámetros, cuando se define como free_space = capacidad - flores.size() no significa que se recalculará automáticamente.

Sin embargo, esto se puede implementar con la ayuda de getter que devuelve el resultado del cálculo (no se necesita ningún campo separado):

public int getFreeSpace() {
    return capacity - flowers.size();
}

También vale la pena anular el método toString para imprimir la instantánea de la clase Pot y cal.l este captador:

@Override
public String toString() {
    return String.format("Pot: {shape=%s, capacity=%d, flowers count=%d, free size=%d}", 
        shape, capacity, flowers.size(), getFreeSpace());
}

Prueba:

Pot p = new Pot("square", 8);
System.out.println(p); // Pot: {shape=square, capacity=8, flowers count=0, free size=8}

p.insert(new Flower());
System.out.println(p); // Pot: {shape=square, capacity=8, flowers count=1, free size=7}
// etc

Sin embargo, a partir de Java 8, donde se introdujeron lambdas e interfaces funcionales, es posible reemplazar el getter de cálculo con un campo que en este caso debería ser Proveedor<Integer>:

public Supplier<Integer> freeSpace = () -> capacity - flowers.size();

Entonces este proveedor puede ser invocado como: freeSpace.get() y se recalcula el valor real.

Actualización después del comentario de @dariosicily Además, IntSupplier podría usarse con su método getAsInt:

IntSupplier freeSpace = () -> capacity - flowers.size();

System.out.println(freeSpace.getAsInt());

1

1

En lugar de Proveedor<Enentero> Creo que es posible utilizar IntSupplier con el método getAsInt.

-dariosicily

27 de marzo de 2021 a las 9:59



------------------------------------

El cálculo lo haces en la inicialización. por supuesto siempre devolverá el tamaño 0

0

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare