Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:ffit:3-jahr:java:learningunits:lu05:c [2025/09/16 07:24] – apeter | de:modul:ffit:3-jahr:java:learningunits:lu05:c [2025/09/18 02:29] (aktuell) – apeter | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== LU05c - Generische | + | ====== LU05c - Generische |
| In Java können Klassen und auch Interfaces einen oder gar mehrere generische Typen haben. Beispielsweise hat die Klasse'' | In Java können Klassen und auch Interfaces einen oder gar mehrere generische Typen haben. Beispielsweise hat die Klasse'' | ||
| Zeile 15: | Zeile 15: | ||
| List< | List< | ||
| </ | </ | ||
| + | |||
| + | Der Vorteil von generischen Typen ist, dass die implementierten Methoden oder die übergebenen Attribute mit diesem Typ erzwungen werden können. | ||
| + | |||
| + | <code java> | ||
| + | public interface List< | ||
| + | ... | ||
| + | | ||
| + | boolean add(E e); | ||
| + | | ||
| + | ... | ||
| + | | ||
| + | E get(int index); | ||
| + | ... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code java> | ||
| + | public class ArrayList< | ||
| + | ... | ||
| + | public boolean add(E e) { | ||
| + | modCount++; | ||
| + | add(e, elementData, | ||
| + | return true; | ||
| + | } | ||
| + | ... | ||
| + | public E get(int index) { | ||
| + | Objects.checkIndex(index, | ||
| + | return elementData(index); | ||
| + | } | ||
| + | ... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Generische Typen in der Library App ==== | ||
| Eine Klasse oder ein Interface kann auch einen konkreten generischen Typ fix vererbt bekommen. In diesem Fall wird bei der Verwendung von '' | Eine Klasse oder ein Interface kann auch einen konkreten generischen Typ fix vererbt bekommen. In diesem Fall wird bei der Verwendung von '' | ||
| Zeile 21: | Zeile 56: | ||
| </ | </ | ||
| - | {{: | + | {{: |
| + | <code java> | ||
| + | public abstract class AbstractPersistor< | ||
| + | protected final Logger log = LoggerFactory.getLogger(this.getClass()); | ||
| + | private final EntityManagerFactory emf; | ||
| + | protected AbstractPersistor() { | ||
| + | this.emf = Persistence.createEntityManagerFactory(" | ||
| + | } | ||
| + | |||
| + | public void save(T t) { | ||
| + | executeTransaction(em -> em.merge(t)); | ||
| + | } | ||
| + | |||
| + | protected void executeTransaction(Consumer< | ||
| + | try (EntityManager em = emf.createEntityManager()) { | ||
| + | try { | ||
| + | em.getTransaction().begin(); | ||
| + | action.accept(em); | ||
| + | em.getTransaction().commit(); | ||
| + | } catch (RuntimeException e) { | ||
| + | if (em.getTransaction().isActive()) { | ||
| + | em.getTransaction().rollback(); | ||
| + | } | ||
| + | log.error(" | ||
| + | throw e; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void close() { | ||
| + | if (emf != null && emf.isOpen()) { | ||
| + | emf.close(); | ||
| + | log.info(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | <code java> | ||
| + | try (var bookPersistor = new BookPersistor()){ | ||
| + | bookPersistor.save(myBook); | ||
| + | } | ||
| + | </ | ||