Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
de:modul:ffit:3-jahr:java:learningunits:lu05:c [2025/09/16 08:35] apeterde:modul:ffit:3-jahr:java:learningunits:lu05:c [2025/09/18 02:29] (aktuell) apeter
Zeile 15: Zeile 15:
 List<String> myList = new ArrayList<>(); List<String> myList = new ArrayList<>();
 </code> </code>
 +
 +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<E> ... {
 +    ...
 +    
 +    boolean add(E e);
 +    
 +    ...
 +    
 +    E get(int index);
 +    ...
 +}
 +</code>
 +
 +<code java>
 +public class ArrayList<E> ... implements List<E> ... {
 +    ...
 +    public boolean add(E e) {
 +        modCount++;
 +        add(e, elementData, size);
 +        return true;
 +    }
 +    ...
 +    public E get(int index) {
 +        Objects.checkIndex(index, size);
 +        return elementData(index);
 +    }
 +    ...
 +}
 +</code>
 +
 +
 +==== 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 ''BookPersistor'' immer ''Book'' als generischen Typ verwendet. Eine Klasse oder ein Interface kann auch einen konkreten generischen Typ fix vererbt bekommen. In diesem Fall wird bei der Verwendung von ''BookPersistor'' immer ''Book'' als generischen Typ verwendet.
Zeile 21: Zeile 56:
 </code> </code>
  
-{{:de:modul:ffit:3-jahr:java:learningunits:lu05:uml_generic_type_example_1.png|}}+{{:de:modul:ffit:3-jahr:java:learningunits:lu05:uml_generic_type_example_2.png|}}
  
 +<code java>
 +public abstract class AbstractPersistor<T> implements AutoCloseable {
  
 +    protected final Logger log = LoggerFactory.getLogger(this.getClass());
 +    private final EntityManagerFactory emf;
  
 +    protected AbstractPersistor() {
 +        this.emf = Persistence.createEntityManagerFactory("localPU", Config.getProperties());
 +    }
 +
 +    public void save(T t) {
 +        executeTransaction(em -> em.merge(t));
 +    }
 +
 +    protected void executeTransaction(Consumer<EntityManager> action) {
 +        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("Error during transaction:", e);
 +                throw e;
 +            }
 +        }
 +    }
 +
 +    @Override
 +    public void close() {
 +        if (emf != null && emf.isOpen()) {
 +            emf.close();
 +            log.info("EntityManagerFactory closed");
 +        }
 +    }
 +
 +</code>
 +
 +<code java>
 +try (var bookPersistor = new BookPersistor()){
 +    bookPersistor.save(myBook);
 +}
 +</code>
  • de/modul/ffit/3-jahr/java/learningunits/lu05/c.1758004506.txt.gz
  • Zuletzt geändert: 2025/09/16 08:35
  • von apeter