Creazione di una copia modificata di un'istanza di un'interfaccia astratta

2

Dire che ho un'interfaccia Interface , che contiene solo getter per vari campi. Questa interfaccia ha implementazioni multiple (diciamo Foo e Bar ), ognuna delle quali aggiunge vari campi. Tutte queste implementazioni sono immutabili.

Supponiamo di avere un'istanza interface di Interface e voglio creare una copia di questa istanza che modifichi uno dei campi esposti da Interface . Come posso ottenere questo risultato senza lanciare interface su un sottotipo? Non riesco a utilizzare una classe Builder per Interface perché si tratta di un'interfaccia astratta.

Credo che questo problema sia un problema di OOP abbastanza generico, ma qui è come apparirebbe il codice Java per esso:

public interface Interface {
     public int getVersion();
}

public class Foo implements Interface {
     private final int version;
     private final String owner;

     public Foo(int version, String owner) {
          this.version = version;
          this.owner = owner;
     }

     public int getVersion() {
          return version;
     }

     public String getOwner() {
          return owner;
     }

     public String toString() {
          StringBuilder builder = new StringBuilder(owner);
          builder.append(" v");
          builder.append(version);
          return builder.toString();
     }
}

public Bar implements Interface {
     // similar to Foo
}

e la situazione in cui voglio copiare un'istanza esistente:

Interface instance = new Foo(1, "some value");
assertEquals("some value v1", instance.toString());
Parent copy = // create the copy based on instance but updating the version to 2
assertEquals("some value v2", copy.toString());
    
posta pintoch 25.01.2018 - 12:44
fonte

2 risposte

1

Molto semplice. Aggiungi un metodo "copyWithVersion ()" all'interfaccia e implementalo in entrambe le implementazioni.

A proposito. "Parent" non è un buon nome per un'interfaccia. Potremmo usare quel nome per una classe base ma non per un'interfaccia.

    
risposta data 25.01.2018 - 12:59
fonte
1

Poiché l'interfaccia consiste di "getter per vari campi", puoi semplicemente creare un altro oggetto, chiamato forse "InterfaceCloner" che ha il compito di creare copie. È inoltre possibile aggiungere metodi all'interfaccia che "cambiano" i campi, ma in realtà restituiscono una nuova istanza come questa classe vettoriale 3D: link

Anche se vorrei sottolineare che pensare a metodi come "esporre campi" e usare "getter" non mi sembra la soluzione più gestibile. Il fatto che gli implementatori, "ognuno dei quali aggiunge vari campi", mi fa pensare che non stai sfruttando appieno il potenziale dell'interfaccia. Penso alle interfacce come a cose che hanno solo un comportamento, indipendentemente da come viene eseguito il backup. Tutti gli implementatori non possono aggiungere comportamenti, poiché ciò comporterebbe un minore utilizzo dell'interfaccia (una violazione del principio di sostituzione di Liskov ). Penso che usare il mio primo suggerimento insieme a un metodo equals(Object) che controlla solo i metodi dell'interfaccia (comportamento, campi non esposti!) Sia la soluzione più gestibile.

    
risposta data 26.03.2018 - 10:33
fonte

Leggi altre domande sui tag