Типы mutables в Java?

Хорошие, мне хотелось бы знать, что это действительно Типы Mutables в Java, так как у меня не остается очень ясным иногда во время делания классов. Привет

3
задан 02.04.2016, 16:17
2 ответа

Ответ Ipman1971 частично правилен. Класс - mutable, когда он позволяет изменять Ваше состояние, это, изменять стоимость полей, которые он содержит, уже было, сделав Ваши публичные поля или поставив методы, которые позволяют изменять стоимость полей.

Неизменный класс не только не поставляет методы, которые позволяют изменение Вашего состояния, но как только инициализировался объект вышеупомянутого класса, не возможно изменять Ваше состояние никоим образом. Любая операция, что заканчивается изменением состояния то, что он делает в действительности, состоит в том, чтобы возвращать новый объект того же класса, но с измененным состоянием. Чтобы этого добиваться, должны быть удовлетворенными следующие условия в определении класса:

  1. Поля должны быть объявленными как постоянные. В случае Java, этого добиваются, добавив модификатор final в поля.
  2. Поля должны быть в свою очередь неизменными.
  3. Если они должны себе реализовывать операции на классе, чтобы изменять состояние, они должны себе определять методы, которые возвращали бы инстанцию класса вместо того, чтобы изменять состояние прямо (что было бы "невозможным", так как поля объявлены как final).

Здесь пример неизменного класса, который выполняет все эти аспекты в счете:

public class Inmutable {
    //los primitivos son inmutables por defecto
    private final int id;
    //String es una clase inmutable
    private final String nombre;
    //List no se puede saber si es inmutable pero eso tiene arreglo
    //la clase a almacenar en esta lista también debe ser inmutable
    //sino Inmutable no sería del todo inmutable
    private final List<BigDecimal> listaNumeros;
    //En Java, la clase java.util.Date no es inmutable
    //por ende, para trabajar con una fecha en una clase inmutable
    //hay dos opciones: 1) Almacenar el long que representa al tiempo
    //en lugar de almacenar Date. 2) Utilizar clases de un API que provee
    //manejo de fechas para Java como Joda Time o Date and Time disponible
    //desde Java 8 en el paquete java.time
    //Para este caso, utilizaré la opción 1)
    private final long fechaNacimiento;

    //en el constructor se deben inicializar todos los campos
    //ojo: se recibe un como parámetro
    public Inmutable(int id, String nombre, List<BigDecimal> listaNumeros, Date fechaNacimiento) {
        this.id = id;
        this.nombre = nombre;
        //para el caso de la lista, se decora para que sea inmutable
        this.listaNumeros = Collections.unmodifiableList(listaNumeros);
        //en el caso de Date, se almacena solo el valor entero
        this.fechaNacimiento = fechaNacimiento.getTime();
    }

    //se crean getters para acceder a los campos
    //se devuelve el primitivo puesto que no se puede modificar su valor
    public int getId() {
        return this.id;
    }
    //se devuelve la instancia directamente puesto que no se puede modificar su estado
    public String getNombre() {
        return this.nombre;
    }
    //se puede devolver esta lista puesto que ya es inmutable
    //no hay problema si el cliente intenta modificarla
    //se lanzara una excepción por el comportamiento de la lista
    //devuelta por Collections#unmodifiableList
    public List<BigDecimal> getListaNumeros() {
        return this.listaNumeros;
    }
    //se devuelve una instancia de Date para el cliente de esta clase
    //puesto que esta instancia de Date no está asociada a la clase
    //no importa si el cliente modifica su estado
    public Date getFechaNacimiento() {
        return new Date(fechaNacimiento);
    }

    //se agregan dos operaciones
    //una para agregar valores a la lista de numeros
    //otro para "cambiar" la fecha de nacimiento

    public Inmutable agregaNumero(BigDecimal numero) {
        //preparamos la nueva lista a utilizar
        List<BigDecimal> nuevaListaNumeros = new ArrayList<>(listaNumeros);
        nuevaListaNumeros.add(numero);
        //siempre se crea una nueva instancia a devolver
        //de esta forma la instancia actual no altera su estado
        return new Inmutable(id, nombre, nuevaListaNumeros, new Date(fechaNacimiento));
    }

    public Inmutable setFechaNacimiento(Date fechaNacimiento) {
        return new Inmutable(id, nombre, listaNumeros, fechaNacimiento);
    }
}
5
ответ дан 24.11.2019, 14:39
  • 1
    Безгрешный ответ особенно она t и # 233; cnica создания новой инстанции. – rnrneverdies 02.04.2016, 23:56

Так как я думаю, что ты будешь понимать это быстро, у объекта mutable есть свойства, которые могут изменять стоимость, для этого у класса есть методы, которые позволяют изменение свойств.

И неизменный объект тот, что не позволяет изменять Ваши свойства, они распределены в Вашем создании и не могут быть измененными. Я помещаю тебе пример:

public class Mutable {
  private int id;

  Mutable(int id) {
    this.id=id;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id=id;
  }

}

public class Inmutable {
  //final cumple dos roles
  //1. Forzar que se inicialize el campo 1 sola vez en la clase
  // y que no se le pueda cambiar el valor
  //2. Fuerza que el campo se inicie en el constructor de la clase
  private final int id;

  Inmutable(int id) {
    this.id=id;
  }

  public int getId() {
    return id;
  }

}
4
ответ дан 24.11.2019, 14:39
  • 1
    В Inmutable convendr и # 237; чтобы показывать, что поле id должно быть помечено как final, чтобы гарантировать Вашу неизменность –  02.04.2016, 16:41
  • 2
    Точный, но единственный quer и # 237, то есть на Неизменных Типах. Но чтобы делать класс, нужно объявлять класс как конец и Ваши признаки tambi и # 233; n, a уедь снимания м и # 233; все модификаторы. – RoyalUp 02.04.2016, 16:56
  • 3
    Большое спасибо обоим! – RoyalUp 02.04.2016, 16:57
  • 4
    @DioniG и # 225; lvezCamacho, если не помечается поле как final, значь, что он может быть измененным изнутри класса. Если поля, которые они составляют в класс, не являются неизменными, или им не помечается неизменность, тогда ты не можешь говорить, что твой класс неизменный. –  02.04.2016, 18:09