J2EE war recht komplex und unübersichtlich, was viele durchaus zu Recht zu anderen Plattformen getrieben hat. Seit Java EE 5/6/7 ist das Thema aber deutlich verbessert: Der Fokus liegt nun eindeutig auf der Unterstützung der Entwickler und nicht mehr, wie zuvor, auf der für den Betrieb notwendigen Technik.
Durch Java 8 läßt sich nun noch eine weitere Verschönerung erreichen. Damit werden Java-EE-Anwendungen deutlich strukturierter!
Das folgende kleine Java-8-Programm tut den Trick:
package de.gedoplan.beantrial; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Collectors; public class SourceCleaner { public static void main(String[] args) throws IOException { for (String filename : args) { Files .lines(Paths.get(filename)) .flatMapToInt(line -> line.codePoints()) .mapToObj(i -> Character.valueOf((char) i)) .collect(Collectors.groupingBy(x -> x, Collectors.summingInt(x -> 1))) .entrySet() .stream() .map(e -> new String(new char[e.getValue()]).replace('\0', e.getKey())) .forEach(System.out::println); } } }
Aus einer unübersichtlichen Quelle wie der folgenden
package de.gedoplan.seminar.cdi.demo.intercept.interceptor; import java.io.Serializable; import javax.inject.Inject; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; import javax.transaction.Status; import javax.transaction.SystemException; import javax.transaction.UserTransaction; import org.apache.commons.logging.Log; /** * Interceptor-Implementierung zu {@link TransactionRequired}. * * @author dw */ @TransactionRequired @Interceptor public class TransactionRequiredInterceptor implements Serializable { private static final long serialVersionUID = 1L; @Inject Log logger; @Inject UserTransaction userTransaction; /** * Interceptor-Arbeitsmethode. * * @param invocationContext InvocationContext * @return Returnwert * @throws Exception bei Fehlern */ @AroundInvoke public Object manageTransaction(InvocationContext invocationContext) throws Exception { // Falls schon eine TX aktiv, Methode direkt aufrufen if (isTransactionActive()) { return invocationContext.proceed(); } // TX beginnen if (this.logger.isDebugEnabled()) { this.logger.debug("Begin tx"); } this.userTransaction.begin(); try { // Methode aufrufen Object result = invocationContext.proceed(); // TX committen if (this.logger.isDebugEnabled()) { this.logger.debug("Commit tx"); } this.userTransaction.commit(); return result; } catch (Exception e) // CHECKSTYLE:IGNORE Allgemeine Exception ist hier OK { // TX zurückrollen if (this.logger.isDebugEnabled()) { this.logger.debug("Rollback tx"); } try { this.userTransaction.rollback(); } catch (Throwable ignore) { } throw e; } } // Ist die TX aktiv? private boolean isTransactionActive() throws SystemException { return this.userTransaction.getStatus() == Status.STATUS_ACTIVE; } }
wird die folgende, übersichliche und auch kürzere Form:
"""""" ((((((((((((((((((((( ))))))))))))))))))))) ************** , -- ................................................... ////////////////// 1 : ;;;;;;;;;;;;;;;;;;;;;;;; ==== ? @@@@@@@@@@ AAAAAAAA B CCCCCCCCCCC DDDD EEEEEEEEEEEEE FF G H IIIIIIIIIIIIIIIIII KK LLLL MM N OOOO RRRRRR SSSSSSSSSS TTTTTTTTTTTTTTTTTTTTTTT UUUU VV XXXXX Y _ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ddddddddddddddddddddddd eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee fffffffff ggggggggggggggggggggggggggggggggggggg hhhhhhhhhhhhhhhhhhhhhhhhh iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii jjjjjjjjjjjjjj kkkkkkkkkk llllllllllllllllllllllllllllllllllllllll mmmmmmmmmmmmmmmmmmmmmmmmmmmmm nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ppppppppppppppppppppppppppppppppppppp qqq rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu vvvvvvvvvvvvvvvvvvvvvvv wwwwwww xxxxxxxxxxxxxxxxxxxxxxx yyyy zzzz {{{{{{{{{{{{ ü }}}}}}}}}}}}
Probieren Sie’s aus. Es funktioniert übrigens nicht nur für Java-Quellen, sondern auch für JavaScript, HTML, ja sogar für C#!