<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.byte-welt.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Headnut</id>
	<title>Byte-Welt Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.byte-welt.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Headnut"/>
	<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php/Spezial:Beitr%C3%A4ge/Headnut"/>
	<updated>2026-07-22T02:48:31Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Log4J2_-_Einfaches_Konfigurationsfile&amp;diff=6600</id>
		<title>Log4J2 - Einfaches Konfigurationsfile</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Log4J2_-_Einfaches_Konfigurationsfile&amp;diff=6600"/>
		<updated>2014-10-05T14:37:17Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Log4J2 Konfigurationsdatei speichert im Ordner logs drei Dateien (Infos.log, Warn.log, Error.log) &lt;br /&gt;
&lt;br /&gt;
Aus dem Java Program kann nun in die einzelnen Levels geschrieben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;log.info(&amp;quot;Hello world - info log&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&amp;lt;code=java&amp;gt;log.warn(&amp;quot;Hello world - warn log&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&amp;lt;code=java&amp;gt;log.erro(&amp;quot;Hello world - error log&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Console kommt jede Ausgabe, in den Logfiles nur die der entsprechenden Ebene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=xml&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;Configuration&amp;gt;&lt;br /&gt;
	&amp;lt;Appenders&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Ausgabe in der Konsole --&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Keine Filter angewendet --&amp;gt;&lt;br /&gt;
		&amp;lt;Console name=&amp;quot;STDOUT&amp;quot; target=&amp;quot;SYSTEM_OUT&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout pattern=&amp;quot;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Console&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Infos - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileInfo&amp;quot; fileName=&amp;quot;logs/Info.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.info.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;info&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;warn&amp;quot; onMatch=&amp;quot;DENY&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;NEUTRAL&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Warn - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileWarn&amp;quot; fileName=&amp;quot;logs/Warn.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.warn.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;warn&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;error&amp;quot; onMatch=&amp;quot;DENY&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;NEUTRAL&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Error - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileError&amp;quot; fileName=&amp;quot;logs/Error.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.error.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;error&amp;quot; onMatch=&amp;quot;ACCEPT&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;DENY&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
	&amp;lt;/Appenders&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Loggers&amp;gt;&lt;br /&gt;
		&amp;lt;Logger name=&amp;quot;org.apache.log4j2.xml&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileInfo&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileWarn&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileError&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Logger&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Root level=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;STDOUT&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileInfo&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileWarn&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileError&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Root&amp;gt;&lt;br /&gt;
	&amp;lt;/Loggers&amp;gt;&lt;br /&gt;
&amp;lt;/Configuration&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code=xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:headnut|headnut]] 16:36, 05. Okt 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Log4J2_-_Einfaches_Konfigurationsfile&amp;diff=6599</id>
		<title>Log4J2 - Einfaches Konfigurationsfile</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Log4J2_-_Einfaches_Konfigurationsfile&amp;diff=6599"/>
		<updated>2014-10-05T14:35:56Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Log4J2 Konfigurationsdatei speichert im Ordner logs drei Dateien (Infos.log, Warn.log, Error.log) &lt;br /&gt;
&lt;br /&gt;
Aus dem Java Program kann nun in die einzelnen Levels geschrieben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;log.info(&amp;quot;Hello world - info log&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&amp;lt;code=java&amp;gt;log.warn(&amp;quot;Hello world - warn log&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&amp;lt;code=java&amp;gt;log.erro(&amp;quot;Hello world - error log&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Console kommt jede Ausgabe, in den Logfiles nur die der entsprechenden Ebene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=xml&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;Configuration&amp;gt;&lt;br /&gt;
	&amp;lt;Appenders&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Ausgabe in der Konsole --&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Keine Filter angewendet --&amp;gt;&lt;br /&gt;
		&amp;lt;Console name=&amp;quot;STDOUT&amp;quot; target=&amp;quot;SYSTEM_OUT&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout pattern=&amp;quot;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Console&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Infos - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileInfo&amp;quot; fileName=&amp;quot;logs/Info.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.info.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;info&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;warn&amp;quot; onMatch=&amp;quot;DENY&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;NEUTRAL&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Warn - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileWarn&amp;quot; fileName=&amp;quot;logs/Warn.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.warn.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;warn&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;error&amp;quot; onMatch=&amp;quot;DENY&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;NEUTRAL&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Error - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileError&amp;quot; fileName=&amp;quot;logs/Error.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.error.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;error&amp;quot; onMatch=&amp;quot;ACCEPT&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;DENY&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
	&amp;lt;/Appenders&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Loggers&amp;gt;&lt;br /&gt;
		&amp;lt;Logger name=&amp;quot;org.apache.log4j2.xml&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileInfo&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileWarn&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileError&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Logger&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Root level=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;STDOUT&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileInfo&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileWarn&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileError&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Root&amp;gt;&lt;br /&gt;
	&amp;lt;/Loggers&amp;gt;&lt;br /&gt;
&amp;lt;/Configuration&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code=xml&amp;gt;&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Log4J2_-_Einfaches_Konfigurationsfile&amp;diff=6598</id>
		<title>Log4J2 - Einfaches Konfigurationsfile</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Log4J2_-_Einfaches_Konfigurationsfile&amp;diff=6598"/>
		<updated>2014-10-05T14:34:11Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde neu angelegt: „Die Log4J2 Konfigurationsdatei speichert im Ordner logs drei Dateien (Infos.log, Warn.log, Error.log)   Aus dem Java Program kann nun in die einzelnen Levels gesc…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Log4J2 Konfigurationsdatei speichert im Ordner logs drei Dateien (Infos.log, Warn.log, Error.log) &lt;br /&gt;
&lt;br /&gt;
Aus dem Java Program kann nun in die einzelnen Levels geschrieben werden:&lt;br /&gt;
&lt;br /&gt;
[code=java]log.info(&amp;quot;Hello world - info log&amp;quot;);[/code]&lt;br /&gt;
[code=java]log.warn(&amp;quot;Hello world - warn log&amp;quot;);[/code]&lt;br /&gt;
[code=java]log.erro(&amp;quot;Hello world - error log&amp;quot;);[/code]&lt;br /&gt;
&lt;br /&gt;
In der Console kommt jede Ausgabe, in den Logfiles nur die der entsprechenden Ebene:&lt;br /&gt;
&lt;br /&gt;
[code=xml]&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;Configuration&amp;gt;&lt;br /&gt;
	&amp;lt;Appenders&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Ausgabe in der Konsole --&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Keine Filter angewendet --&amp;gt;&lt;br /&gt;
		&amp;lt;Console name=&amp;quot;STDOUT&amp;quot; target=&amp;quot;SYSTEM_OUT&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout pattern=&amp;quot;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Console&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Infos - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileInfo&amp;quot; fileName=&amp;quot;logs/Info.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.info.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;info&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;warn&amp;quot; onMatch=&amp;quot;DENY&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;NEUTRAL&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Warn - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileWarn&amp;quot; fileName=&amp;quot;logs/Warn.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.warn.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;warn&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;error&amp;quot; onMatch=&amp;quot;DENY&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;NEUTRAL&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Aufzeichnen der Error - Ausgaben --&amp;gt;&lt;br /&gt;
		&amp;lt;RollingFile name=&amp;quot;fileError&amp;quot; fileName=&amp;quot;logs/Error.log&amp;quot;&lt;br /&gt;
			filePattern=&amp;quot;logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.error.gz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Layout des Textes --&amp;gt;&lt;br /&gt;
			&amp;lt;PatternLayout&amp;gt;&lt;br /&gt;
				&amp;lt;pattern&amp;gt;%d %-5p [%t] %C{2} (%F:%L) - %m%n&amp;lt;/pattern&amp;gt;&lt;br /&gt;
			&amp;lt;/PatternLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Filter --&amp;gt;&lt;br /&gt;
			&amp;lt;Filters&amp;gt;&lt;br /&gt;
				&amp;lt;ThresholdFilter level=&amp;quot;error&amp;quot; onMatch=&amp;quot;ACCEPT&amp;quot;&lt;br /&gt;
					onMismatch=&amp;quot;DENY&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Filters&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;!-- Maximale Groesse des Files --&amp;gt;&lt;br /&gt;
			&amp;lt;Policies&amp;gt;&lt;br /&gt;
				&amp;lt;SizeBasedTriggeringPolicy size=&amp;quot;5 MB&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/Policies&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;!-- Maximale Anzahl der Files die gesichert werden --&amp;gt;&lt;br /&gt;
			&amp;lt;DefaultRolloverStrategy max=&amp;quot;20&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/RollingFile&amp;gt;&lt;br /&gt;
	&amp;lt;/Appenders&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;Loggers&amp;gt;&lt;br /&gt;
		&amp;lt;Logger name=&amp;quot;org.apache.log4j2.xml&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileInfo&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileWarn&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;appender-ref ref=&amp;quot;fileError&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Logger&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;Root level=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;STDOUT&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileInfo&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileWarn&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;AppenderRef ref=&amp;quot;fileError&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Root&amp;gt;&lt;br /&gt;
	&amp;lt;/Loggers&amp;gt;&lt;br /&gt;
&amp;lt;/Configuration&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[/code]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5939</id>
		<title>Dependency/Code Injection mit Google Guice!</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5939"/>
		<updated>2013-12-25T08:57:14Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Den Anfang macht das Bean. Angefangen mit dem Interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Config {&lt;br /&gt;
	public String getValue(String key);&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die ConfigImpl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ConfingImpl implements Config {&lt;br /&gt;
	&lt;br /&gt;
	private Map&amp;lt;String, String&amp;gt; prefs = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	public ConfingImpl() {&lt;br /&gt;
		super();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public String getValue(String key) {&lt;br /&gt;
		return this.prefs.get(key);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value) {&lt;br /&gt;
		this.prefs.put(key, value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ReadController: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
 &lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 *&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 *&lt;br /&gt;
 * Company:&lt;br /&gt;
 *&lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ReadController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  private Config conf;&lt;br /&gt;
 &lt;br /&gt;
  @Inject  &lt;br /&gt;
  public ReadController(Config conf)&lt;br /&gt;
  {&lt;br /&gt;
    super();&lt;br /&gt;
    this.conf = conf;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void printConfig() &lt;br /&gt;
  {&lt;br /&gt;
    System.out.println(&amp;quot;Konfiguration: Test=&amp;quot; + this.conf.getValue(&amp;quot;Test&amp;quot;));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man hier sieht, hat man hier mehr keinen leeren (oder Standard) Konstruktor sondern einen mit dem Bean als Namen. Desweiteren ist das &amp;lt;code=inline&amp;gt;@Inject&amp;lt;/code=inline&amp;gt; sehr wichtig (ohne dem funktioniert der ganze Zauber auch nicht).&lt;br /&gt;
&lt;br /&gt;
WriteController:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class WriteController {&lt;br /&gt;
&lt;br /&gt;
	private Config conf;&lt;br /&gt;
&lt;br /&gt;
	@Inject&lt;br /&gt;
	public WriteController(Config conf) {&lt;br /&gt;
		super();&lt;br /&gt;
		this.conf = conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void doConfig() {&lt;br /&gt;
		this.conf.setValue(&amp;quot;Test&amp;quot;, &amp;quot;42&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch hier hat man wieder einen &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; mit dem Interface, sowie das &amp;lt;code=inline&amp;gt;&#039;&#039;&#039;@Inject&#039;&#039;&#039;&amp;lt;/code=inline&amp;gt; nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
Bei Google Guice hat man &#039;&#039;&#039;keine XML Datei&#039;&#039;&#039;, was angibt welches Interface wohingebunden wird. Stattdessen macht man das in einem &#039;&#039;&#039;Interface (Module)&#039;&#039;&#039; oder einer &#039;&#039;&#039;abstrakten Klasse (AbstractModule)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ich habe diese Konfiguration in meiner main Klasse gemacht. Indem sie von &#039;&#039;&#039;AbstractModule&#039;&#039;&#039; abgeleitet ist und die Methode &#039;&#039;&#039;configure&#039;&#039;&#039; überschreibt. Man könnte es auch über eine &#039;&#039;&#039;anonyme Klasse&#039;&#039;&#039; übergeben (so mache ich es im 2ten Bsp!).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
 &lt;br /&gt;
import com.google.inject.AbstractModule;&lt;br /&gt;
import com.google.inject.Scopes;&lt;br /&gt;
import com.google.inject.Injector;&lt;br /&gt;
import com.google.inject.Guice;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 *&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 *&lt;br /&gt;
 * Company:&lt;br /&gt;
 *&lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class Main extends AbstractModule&lt;br /&gt;
{&lt;br /&gt;
  public Main()&lt;br /&gt;
  {&lt;br /&gt;
    super();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  @Override&lt;br /&gt;
  protected void configure()&lt;br /&gt;
  {&lt;br /&gt;
    //hier wird es zugewiesen&lt;br /&gt;
    bind(Config.class)&lt;br /&gt;
        .to(ConfingImpl.class)&lt;br /&gt;
        .in(Scopes.SINGLETON);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  public static void main(String args[])&lt;br /&gt;
  {&lt;br /&gt;
    Injector injector = Guice.createInjector(new Main()); //holt den Injector&lt;br /&gt;
    ReadController reader = injector.getInstance(ReadController.class); //instanziert die Klasse&lt;br /&gt;
    reader.printConfig();&lt;br /&gt;
    WriteController writer = injector.getInstance(WriteController.class); //nochmals die Klasse&lt;br /&gt;
    writer.doConfig();&lt;br /&gt;
    reader.printConfig();    &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, MUSS man sich den Injector über eine statische Methode holen. Diesen gibt man ein &#039;&#039;&#039;Module&#039;&#039;&#039; oder ein &#039;&#039;&#039;AbstractModule&#039;&#039;&#039; an, welches ungefähr die gleiche Arbeit verrichtet, wie unter spring die XML Datei.&lt;br /&gt;
Es gibt an, worauf unsere Bean/Interface gebunden werden soll.&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
&amp;lt;code=inline&amp;gt;&lt;br /&gt;
Konfiguration: Test=null &amp;lt;br /&amp;gt;&lt;br /&gt;
Konfiguration: Test=42&lt;br /&gt;
&amp;lt;/code=inline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Bsp wie man 2 Beans konfigurieren kann.&lt;br /&gt;
Es ist &#039;&#039;&#039;nicht zwingend notwendig&#039;&#039;&#039;, dass alle &#039;&#039;&#039;Klassen&#039;&#039;&#039; diese &#039;&#039;&#039;Beans&#039;&#039;&#039; im &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; haben.&lt;br /&gt;
&lt;br /&gt;
Hier das neue Interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Demo {&lt;br /&gt;
	public int getDemoWert();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Impl dazu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class DemoImpl implements Demo {&lt;br /&gt;
	private static int var = 0; // um zu sehen wie oft es instanziert wird&lt;br /&gt;
&lt;br /&gt;
	public DemoImpl() {&lt;br /&gt;
		super();&lt;br /&gt;
		var++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getDemoWert() {&lt;br /&gt;
		return var;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der WriteController ist UNVERÄNDERT (also der Konstruktor hat weiterhin nur 1 Parameter).&lt;br /&gt;
&lt;br /&gt;
Neuer ReadController:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ReadController {&lt;br /&gt;
&lt;br /&gt;
	private Config conf;&lt;br /&gt;
	private Demo demo;&lt;br /&gt;
&lt;br /&gt;
	@Inject&lt;br /&gt;
	public ReadController(Config conf, Demo demo) // zusätzlicher parameter&lt;br /&gt;
	{&lt;br /&gt;
		super();&lt;br /&gt;
		this.conf = conf;&lt;br /&gt;
		this.demo = demo;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void printConfig() {&lt;br /&gt;
		System.out.println(&amp;quot;Konfiguration: Test=&amp;quot; + this.conf.getValue(&amp;quot;Test&amp;quot;) + &amp;quot;  DEMO WERT: &amp;quot; + demo.getDemoWert());&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, hat man hier einen zusätzlichen Parameter, aber das stellt kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Neue Main:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.AbstractModule;&lt;br /&gt;
import com.google.inject.Scopes;&lt;br /&gt;
import com.google.inject.Injector;&lt;br /&gt;
import com.google.inject.Guice;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class Main {&lt;br /&gt;
	public static void main(String args[]) {&lt;br /&gt;
		// mit anonamyer Klasse instanzieren&lt;br /&gt;
		Injector injector = Guice.createInjector(new AbstractModule() {&lt;br /&gt;
			@Override&lt;br /&gt;
			protected void configure() {&lt;br /&gt;
				// hier wird es zugewiesen&lt;br /&gt;
				bind(Config.class).to(ConfingImpl.class).in(Scopes.SINGLETON);&lt;br /&gt;
				bind(Demo.class).to(DemoImpl.class).in(Scopes.SINGLETON);&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		ReadController reader = injector.getInstance(ReadController.class);&lt;br /&gt;
		reader.printConfig();&lt;br /&gt;
		WriteController writer = injector.getInstance(WriteController.class);&lt;br /&gt;
		writer.doConfig();&lt;br /&gt;
		reader.printConfig();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Habe den Injector auf eine anonyme Klasse umgebaut und die Ausgabe ist wiefolgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=inline&amp;gt;&lt;br /&gt;
Konfiguration: Test=null DEMO WERT: 1 &amp;lt;br /&amp;gt;&lt;br /&gt;
Konfiguration: Test=42 DEMO WERT: 1&lt;br /&gt;
&amp;lt;/code=inline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, geht Code Injection mit Google Guice recht leicht.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
[https://code.google.com/p/google-guice/ Google Guice]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:eRaaaa|thE_29 ]] 17:07, 24. Marz 2009 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:DI Google Guice]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5938</id>
		<title>Dependency/Code Injection mit Google Guice!</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5938"/>
		<updated>2013-12-25T08:55:53Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Den Anfang macht das Bean. Angefangen mit dem Interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Config {&lt;br /&gt;
	public String getValue(String key);&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die ConfigImpl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ConfingImpl implements Config {&lt;br /&gt;
	&lt;br /&gt;
	private Map&amp;lt;String, String&amp;gt; prefs = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	public ConfingImpl() {&lt;br /&gt;
		super();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public String getValue(String key) {&lt;br /&gt;
		return this.prefs.get(key);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value) {&lt;br /&gt;
		this.prefs.put(key, value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ReadController: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
 &lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 *&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 *&lt;br /&gt;
 * Company:&lt;br /&gt;
 *&lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ReadController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  private Config conf;&lt;br /&gt;
 &lt;br /&gt;
  @Inject  &lt;br /&gt;
  public ReadController(Config conf)&lt;br /&gt;
  {&lt;br /&gt;
    super();&lt;br /&gt;
    this.conf = conf;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void printConfig() &lt;br /&gt;
  {&lt;br /&gt;
    System.out.println(&amp;quot;Konfiguration: Test=&amp;quot; + this.conf.getValue(&amp;quot;Test&amp;quot;));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man hier sieht, hat man hier mehr keinen leeren (oder Standard) Konstruktor sondern einen mit dem Bean als Namen. Desweiteren ist das &amp;lt;code=inline&amp;gt;@Inject&amp;lt;/code=inline&amp;gt; sehr wichtig (ohne dem funktioniert der ganze Zauber auch nicht).&lt;br /&gt;
&lt;br /&gt;
WriteController:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class WriteController {&lt;br /&gt;
&lt;br /&gt;
	private Config conf;&lt;br /&gt;
&lt;br /&gt;
	@Inject&lt;br /&gt;
	public WriteController(Config conf) {&lt;br /&gt;
		super();&lt;br /&gt;
		this.conf = conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void doConfig() {&lt;br /&gt;
		this.conf.setValue(&amp;quot;Test&amp;quot;, &amp;quot;42&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch hier hat man wieder einen &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; mit dem Interface, sowie das &amp;lt;code=inline&amp;gt;&#039;&#039;&#039;@Inject&#039;&#039;&#039;&amp;lt;/code=inline&amp;gt; nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
Bei Google Guice hat man &#039;&#039;&#039;keine XML Datei&#039;&#039;&#039;, was angibt welches Interface wohingebunden wird. Stattdessen macht man das in einem &#039;&#039;&#039;Interface (Module)&#039;&#039;&#039; oder einer &#039;&#039;&#039;abstrakten Klasse (AbstractModule)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ich habe diese Konfiguration in meiner main Klasse gemacht. Indem sie von &#039;&#039;&#039;AbstractModule&#039;&#039;&#039; abgeleitet ist und die Methode &#039;&#039;&#039;configure&#039;&#039;&#039; überschreibt. Man könnte es auch über eine &#039;&#039;&#039;anonyme Klasse&#039;&#039;&#039; übergeben (so mache ich es im 2ten Bsp!).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
 &lt;br /&gt;
import com.google.inject.AbstractModule;&lt;br /&gt;
import com.google.inject.Scopes;&lt;br /&gt;
import com.google.inject.Injector;&lt;br /&gt;
import com.google.inject.Guice;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 *&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 *&lt;br /&gt;
 * Company:&lt;br /&gt;
 *&lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class Main extends AbstractModule&lt;br /&gt;
{&lt;br /&gt;
  public Main()&lt;br /&gt;
  {&lt;br /&gt;
    super();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  @Override&lt;br /&gt;
  protected void configure()&lt;br /&gt;
  {&lt;br /&gt;
    //hier wird es zugewiesen&lt;br /&gt;
    bind(Config.class)&lt;br /&gt;
        .to(ConfingImpl.class)&lt;br /&gt;
        .in(Scopes.SINGLETON);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  public static void main(String args[])&lt;br /&gt;
  {&lt;br /&gt;
    Injector injector = Guice.createInjector(new Main()); //holt den Injector&lt;br /&gt;
    ReadController reader = injector.getInstance(ReadController.class); //instanziert die Klasse&lt;br /&gt;
    reader.printConfig();&lt;br /&gt;
    WriteController writer = injector.getInstance(WriteController.class); //nochmals die Klasse&lt;br /&gt;
    writer.doConfig();&lt;br /&gt;
    reader.printConfig();    &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, MUSS man sich den Injector über eine statische Methode holen. Diesen gibt man ein &#039;&#039;&#039;Module&#039;&#039;&#039; oder ein &#039;&#039;&#039;AbstractModule&#039;&#039;&#039; an, welches ungefähr die gleiche Arbeit verrichtet, wie unter spring die XML Datei.&lt;br /&gt;
Es gibt an, worauf unsere Bean/Interface gebunden werden soll.&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
&amp;lt;code=inline&amp;gt;&lt;br /&gt;
Konfiguration: Test=null &amp;lt;br /&amp;gt;&lt;br /&gt;
Konfiguration: Test=42&lt;br /&gt;
&amp;lt;/code=inline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Bsp wie man 2 Beans konfigurieren kann.&lt;br /&gt;
Es ist &#039;&#039;&#039;nicht zwingend notwendig&#039;&#039;&#039;, dass alle &#039;&#039;&#039;Klassen&#039;&#039;&#039; diese &#039;&#039;&#039;Beans&#039;&#039;&#039; im &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; haben.&lt;br /&gt;
&lt;br /&gt;
Hier das neue Interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Demo {&lt;br /&gt;
	public int getDemoWert();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Impl dazu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class DemoImpl implements Demo {&lt;br /&gt;
	private static int var = 0; // um zu sehen wie oft es instanziert wird&lt;br /&gt;
&lt;br /&gt;
	public DemoImpl() {&lt;br /&gt;
		super();&lt;br /&gt;
		var++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getDemoWert() {&lt;br /&gt;
		return var;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der WriteController ist UNVERÄNDERT (also der Konstruktor hat weiterhin nur 1 Parameter).&lt;br /&gt;
&lt;br /&gt;
Neuer ReadController:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ReadController {&lt;br /&gt;
&lt;br /&gt;
	private Config conf;&lt;br /&gt;
	private Demo demo;&lt;br /&gt;
&lt;br /&gt;
	@Inject&lt;br /&gt;
	public ReadController(Config conf, Demo demo) // zusätzlicher parameter&lt;br /&gt;
	{&lt;br /&gt;
		super();&lt;br /&gt;
		this.conf = conf;&lt;br /&gt;
		this.demo = demo;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void printConfig() {&lt;br /&gt;
		System.out.println(&amp;quot;Konfiguration: Test=&amp;quot; + this.conf.getValue(&amp;quot;Test&amp;quot;) + &amp;quot;  DEMO WERT: &amp;quot; + demo.getDemoWert());&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, hat man hier einen zusätzlichen Parameter, aber das stellt kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Neue Main:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.AbstractModule;&lt;br /&gt;
import com.google.inject.Scopes;&lt;br /&gt;
import com.google.inject.Injector;&lt;br /&gt;
import com.google.inject.Guice;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class Main {&lt;br /&gt;
	public static void main(String args[]) {&lt;br /&gt;
		// mit anonamyer Klasse instanzieren&lt;br /&gt;
		Injector injector = Guice.createInjector(new AbstractModule() {&lt;br /&gt;
			@Override&lt;br /&gt;
			protected void configure() {&lt;br /&gt;
				// hier wird es zugewiesen&lt;br /&gt;
				bind(Config.class).to(ConfingImpl.class).in(Scopes.SINGLETON);&lt;br /&gt;
				bind(Demo.class).to(DemoImpl.class).in(Scopes.SINGLETON);&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		ReadController reader = injector.getInstance(ReadController.class);&lt;br /&gt;
		reader.printConfig();&lt;br /&gt;
		WriteController writer = injector.getInstance(WriteController.class);&lt;br /&gt;
		writer.doConfig();&lt;br /&gt;
		reader.printConfig();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Habe den Injector auf eine anonyme Klasse umgebaut und die Ausgabe ist wiefolgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=inline&amp;gt;&lt;br /&gt;
Konfiguration: Test=null DEMO WERT: 1 &amp;lt;br /&amp;gt;&lt;br /&gt;
Konfiguration: Test=42 DEMO WERT: 1&lt;br /&gt;
&amp;lt;/code=inline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, geht Code Injection mit Google Guice recht leicht.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
[https://code.google.com/p/google-guice/ Google Guice]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5937</id>
		<title>Dependency/Code Injection mit Google Guice!</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5937"/>
		<updated>2013-12-25T08:53:26Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Den Anfang macht das Bean. Angefangen mit dem Interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Config {&lt;br /&gt;
	public String getValue(String key);&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die ConfigImpl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ConfingImpl implements Config {&lt;br /&gt;
	&lt;br /&gt;
	private Map&amp;lt;String, String&amp;gt; prefs = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	public ConfingImpl() {&lt;br /&gt;
		super();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public String getValue(String key) {&lt;br /&gt;
		return this.prefs.get(key);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value) {&lt;br /&gt;
		this.prefs.put(key, value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ReadController: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
 &lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 *&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 *&lt;br /&gt;
 * Company:&lt;br /&gt;
 *&lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ReadController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  private Config conf;&lt;br /&gt;
 &lt;br /&gt;
  @Inject  &lt;br /&gt;
  public ReadController(Config conf)&lt;br /&gt;
  {&lt;br /&gt;
    super();&lt;br /&gt;
    this.conf = conf;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void printConfig() &lt;br /&gt;
  {&lt;br /&gt;
    System.out.println(&amp;quot;Konfiguration: Test=&amp;quot; + this.conf.getValue(&amp;quot;Test&amp;quot;));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man hier sieht, hat man hier mehr keinen leeren (oder Standard) Konstruktor sondern einen mit dem Bean als Namen. Desweiteren ist das &amp;lt;code=inline&amp;gt;@Inject&amp;lt;/code=inline&amp;gt; sehr wichtig (ohne dem funktioniert der ganze Zauber auch nicht).&lt;br /&gt;
&lt;br /&gt;
WriteController:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class WriteController {&lt;br /&gt;
&lt;br /&gt;
	private Config conf;&lt;br /&gt;
&lt;br /&gt;
	@Inject&lt;br /&gt;
	public WriteController(Config conf) {&lt;br /&gt;
		super();&lt;br /&gt;
		this.conf = conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void doConfig() {&lt;br /&gt;
		this.conf.setValue(&amp;quot;Test&amp;quot;, &amp;quot;42&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch hier hat man wieder einen &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; mit dem Interface, sowie das &amp;lt;code=inline&amp;gt;&#039;&#039;&#039;@Inject&#039;&#039;&#039;&amp;lt;/code=inline&amp;gt; nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
Bei Google Guice hat man &#039;&#039;&#039;keine XML Datei&#039;&#039;&#039;, was angibt welches Interface wohingebunden wird. Stattdessen macht man das in einem &#039;&#039;&#039;Interface (Module)&#039;&#039;&#039; oder einer &#039;&#039;&#039;abstrakten Klasse (AbstractModule)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ich habe diese Konfiguration in meiner main Klasse gemacht. Indem sie von &#039;&#039;&#039;AbstractModule&#039;&#039;&#039; abgeleitet ist und die Methode &#039;&#039;&#039;configure&#039;&#039;&#039; überschreibt. Man könnte es auch über eine &#039;&#039;&#039;anonyme Klasse&#039;&#039;&#039; übergeben (so mache ich es im 2ten Bsp!).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
 &lt;br /&gt;
import com.google.inject.AbstractModule;&lt;br /&gt;
import com.google.inject.Scopes;&lt;br /&gt;
import com.google.inject.Injector;&lt;br /&gt;
import com.google.inject.Guice;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 *&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 *&lt;br /&gt;
 * Company:&lt;br /&gt;
 *&lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class Main extends AbstractModule&lt;br /&gt;
{&lt;br /&gt;
  public Main()&lt;br /&gt;
  {&lt;br /&gt;
    super();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  @Override&lt;br /&gt;
  protected void configure()&lt;br /&gt;
  {&lt;br /&gt;
    //hier wird es zugewiesen&lt;br /&gt;
    bind(Config.class)&lt;br /&gt;
        .to(ConfingImpl.class)&lt;br /&gt;
        .in(Scopes.SINGLETON);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  public static void main(String args[])&lt;br /&gt;
  {&lt;br /&gt;
    Injector injector = Guice.createInjector(new Main()); //holt den Injector&lt;br /&gt;
    ReadController reader = injector.getInstance(ReadController.class); //instanziert die Klasse&lt;br /&gt;
    reader.printConfig();&lt;br /&gt;
    WriteController writer = injector.getInstance(WriteController.class); //nochmals die Klasse&lt;br /&gt;
    writer.doConfig();&lt;br /&gt;
    reader.printConfig();    &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, MUSS man sich den Injector über eine statische Methode holen. Diesen gibt man ein &#039;&#039;&#039;Module&#039;&#039;&#039; oder ein &#039;&#039;&#039;AbstractModule&#039;&#039;&#039; an, welches ungefähr die gleiche Arbeit verrichtet, wie unter spring die XML Datei.&lt;br /&gt;
Es gibt an, worauf unsere Bean/Interface gebunden werden soll.&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
&amp;lt;code=inline&amp;gt;&lt;br /&gt;
Konfiguration: Test=null&lt;br /&gt;
Konfiguration: Test=42&lt;br /&gt;
&amp;lt;/code=inline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Bsp wie man 2 Beans konfigurieren kann.&lt;br /&gt;
Es ist &#039;&#039;&#039;nicht zwingend notwendig&#039;&#039;&#039;, dass alle &#039;&#039;&#039;Klassen&#039;&#039;&#039; diese &#039;&#039;&#039;Beans&#039;&#039;&#039; im &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; haben.&lt;br /&gt;
&lt;br /&gt;
Hier das neue Interface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Demo {&lt;br /&gt;
	public int getDemoWert();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Impl dazu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class DemoImpl implements Demo {&lt;br /&gt;
	private static int var = 0; // um zu sehen wie oft es instanziert wird&lt;br /&gt;
&lt;br /&gt;
	public DemoImpl() {&lt;br /&gt;
		super();&lt;br /&gt;
		var++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public int getDemoWert() {&lt;br /&gt;
		return var;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der WriteController ist UNVERÄNDERT (also der Konstruktor hat weiterhin nur 1 Parameter).&lt;br /&gt;
&lt;br /&gt;
Neuer ReadController:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ReadController {&lt;br /&gt;
&lt;br /&gt;
	private Config conf;&lt;br /&gt;
	private Demo demo;&lt;br /&gt;
&lt;br /&gt;
	@Inject&lt;br /&gt;
	public ReadController(Config conf, Demo demo) // zusätzlicher parameter&lt;br /&gt;
	{&lt;br /&gt;
		super();&lt;br /&gt;
		this.conf = conf;&lt;br /&gt;
		this.demo = demo;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void printConfig() {&lt;br /&gt;
		System.out.println(&amp;quot;Konfiguration: Test=&amp;quot; + this.conf.getValue(&amp;quot;Test&amp;quot;) + &amp;quot;  DEMO WERT: &amp;quot; + demo.getDemoWert());&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, hat man hier einen zusätzlichen Parameter, aber das stellt kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Neue Main:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.AbstractModule;&lt;br /&gt;
import com.google.inject.Scopes;&lt;br /&gt;
import com.google.inject.Injector;&lt;br /&gt;
import com.google.inject.Guice;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class Main {&lt;br /&gt;
	public static void main(String args[]) {&lt;br /&gt;
		// mit anonamyer Klasse instanzieren&lt;br /&gt;
		Injector injector = Guice.createInjector(new AbstractModule() {&lt;br /&gt;
			@Override&lt;br /&gt;
			protected void configure() {&lt;br /&gt;
				// hier wird es zugewiesen&lt;br /&gt;
				bind(Config.class).to(ConfingImpl.class).in(Scopes.SINGLETON);&lt;br /&gt;
				bind(Demo.class).to(DemoImpl.class).in(Scopes.SINGLETON);&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		ReadController reader = injector.getInstance(ReadController.class);&lt;br /&gt;
		reader.printConfig();&lt;br /&gt;
		WriteController writer = injector.getInstance(WriteController.class);&lt;br /&gt;
		writer.doConfig();&lt;br /&gt;
		reader.printConfig();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Habe den Injector auf eine anonyme Klasse umgebaut und die Ausgabe ist wiefolgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=inline&amp;gt;&lt;br /&gt;
Konfiguration: Test=null DEMO WERT: 1&lt;br /&gt;
Konfiguration: Test=42 DEMO WERT: 1&lt;br /&gt;
&amp;lt;/code=inline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, geht Code Injection mit Google Guice recht leicht.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
[https://code.google.com/p/google-guice/ Google Guice]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5936</id>
		<title>Dependency/Code Injection mit Google Guice!</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5936"/>
		<updated>2013-12-25T08:45:11Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Den Anfang macht das Bean. Angefangen mit dem Interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Config {&lt;br /&gt;
	public String getValue(String key);&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die ConfigImpl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ConfingImpl implements Config {&lt;br /&gt;
	&lt;br /&gt;
	private Map&amp;lt;String, String&amp;gt; prefs = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	public ConfingImpl() {&lt;br /&gt;
		super();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public String getValue(String key) {&lt;br /&gt;
		return this.prefs.get(key);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value) {&lt;br /&gt;
		this.prefs.put(key, value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ReadController: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
 &lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 *&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 *&lt;br /&gt;
 * Company:&lt;br /&gt;
 *&lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ReadController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  private Config conf;&lt;br /&gt;
 &lt;br /&gt;
  @Inject  &lt;br /&gt;
  public ReadController(Config conf)&lt;br /&gt;
  {&lt;br /&gt;
    super();&lt;br /&gt;
    this.conf = conf;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void printConfig() &lt;br /&gt;
  {&lt;br /&gt;
    System.out.println(&amp;quot;Konfiguration: Test=&amp;quot; + this.conf.getValue(&amp;quot;Test&amp;quot;));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man hier sieht, hat man hier mehr keinen leeren (oder Standard) Konstruktor sondern einen mit dem Bean als Namen. Desweiteren ist das &amp;lt;code=inline&amp;gt;@Inject&amp;lt;/code=inline&amp;gt; sehr wichtig (ohne dem funktioniert der ganze Zauber auch nicht).&lt;br /&gt;
&lt;br /&gt;
WriteController:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import com.google.inject.Inject;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class WriteController {&lt;br /&gt;
&lt;br /&gt;
	private Config conf;&lt;br /&gt;
&lt;br /&gt;
	@Inject&lt;br /&gt;
	public WriteController(Config conf) {&lt;br /&gt;
		super();&lt;br /&gt;
		this.conf = conf;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void doConfig() {&lt;br /&gt;
		this.conf.setValue(&amp;quot;Test&amp;quot;, &amp;quot;42&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch hier hat man wieder einen &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; mit dem Interface, sowie das &amp;lt;code=inline&amp;gt;&#039;&#039;&#039;@Inject&#039;&#039;&#039;&amp;lt;/code=inline&amp;gt; nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
Bei Google Guice hat man &#039;&#039;&#039;keine XML Datei&#039;&#039;&#039;, was angibt welches Interface wohingebunden wird. Stattdessen macht man das in einem &#039;&#039;&#039;Interface (Module)&#039;&#039;&#039; oder einer &#039;&#039;&#039;abstrakten Klasse (AbstractModule)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ich habe diese Konfiguration in meiner main Klasse gemacht. Indem sie von &#039;&#039;&#039;AbstractModule&#039;&#039;&#039; abgeleitet ist und die Methode &#039;&#039;&#039;configure&#039;&#039;&#039; überschreibt. Man könnte es auch über eine &#039;&#039;&#039;anonyme Klasse&#039;&#039;&#039; übergeben (so mache ich es im 2ten Bsp!).&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5935</id>
		<title>Dependency/Code Injection mit Google Guice!</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Dependency/Code_Injection_mit_Google_Guice!&amp;diff=5935"/>
		<updated>2013-12-25T08:37:44Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde neu angelegt: „Den Anfang macht das Bean. Angefangen mit dem Interface  [code=java] package guicedemo;  /**  * Title:  *   * Description:  *   * Copyright: Copyright (c) 2009  *…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Den Anfang macht das Bean. Angefangen mit dem Interface&lt;br /&gt;
&lt;br /&gt;
[code=java]&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Config {&lt;br /&gt;
	public String getValue(String key);&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value);&lt;br /&gt;
}&lt;br /&gt;
[/code=java]&lt;br /&gt;
&lt;br /&gt;
Hier die ConfigImpl:&lt;br /&gt;
&lt;br /&gt;
[code=java]&lt;br /&gt;
package guicedemo;&lt;br /&gt;
&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Title:&lt;br /&gt;
 * &lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * Copyright: Copyright (c) 2009&lt;br /&gt;
 * &lt;br /&gt;
 * Company:&lt;br /&gt;
 * &lt;br /&gt;
 * @author Taschek Joerg&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class ConfingImpl implements Config {&lt;br /&gt;
	&lt;br /&gt;
	private Map&amp;lt;String, String&amp;gt; prefs = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
	public ConfingImpl() {&lt;br /&gt;
		super();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public String getValue(String key) {&lt;br /&gt;
		return this.prefs.get(key);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void setValue(String key, String value) {&lt;br /&gt;
		this.prefs.put(key, value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
[/code=java]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Zugriffsmodifizierer_(Java)&amp;diff=5709</id>
		<title>Zugriffsmodifizierer (Java)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Zugriffsmodifizierer_(Java)&amp;diff=5709"/>
		<updated>2013-09-17T11:12:41Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Zugriffsmodifizierer ==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
! Modifizierer&lt;br /&gt;
! Die Klasse selbst&lt;br /&gt;
! Paket-Klassen/innere-Klassen&lt;br /&gt;
! Unterklassen&lt;br /&gt;
! Sonstige Klassen&lt;br /&gt;
|-&lt;br /&gt;
| private&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| public&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| protected&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| ohne/leer&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modifizierer Übersicht ==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
! Modifizierer&lt;br /&gt;
! Anwendbar auf&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| abstract&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Interface &amp;lt;br\&amp;gt;- Methode&lt;br /&gt;
| - Kann nicht instanziiert werden &amp;lt;br\&amp;gt;- Interfaces sind immer abstrakt (modifier optional)&amp;lt;br\&amp;gt; - Hat keinen Body, enthält nur Signatur. (die umschließende Klasse ist selbst auch abstrakt)&lt;br /&gt;
|-&lt;br /&gt;
| final&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Methode &amp;lt;br\&amp;gt;- Objektvariablen&amp;lt;br\&amp;gt;- Variablen&lt;br /&gt;
| - Kann nicht erweitert werden &amp;lt;br\&amp;gt; - Kann nicht überschrieben werden&amp;lt;br\&amp;gt;- Können ihren Wert nicht ändern &amp;lt;br\&amp;gt;- Können ihren Wert nicht ändern&lt;br /&gt;
|-&lt;br /&gt;
| nativ&lt;br /&gt;
| - Methode&lt;br /&gt;
| - Plattform spezifisch (keine Signatur, kein Body)&lt;br /&gt;
|-&lt;br /&gt;
| leer/keiner(package)&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Interface &amp;lt;br\&amp;gt;- Member&lt;br /&gt;
| - Nur im eigenen Paket sichtbar &amp;lt;br\&amp;gt;- Nur im eigenen Paket sichtbar &amp;lt;br\&amp;gt; - Nur im eigenen Paket sichtbar&lt;br /&gt;
|-&lt;br /&gt;
| private&lt;br /&gt;
| - Member&lt;br /&gt;
| - Nur in dieser Klasse sichtbar (wo sie definiert wurde)&lt;br /&gt;
|-&lt;br /&gt;
| protected&lt;br /&gt;
| - Member&lt;br /&gt;
| - Im eigenen package sichtbar und in Subklassen&lt;br /&gt;
|-&lt;br /&gt;
| public&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Interface &amp;lt;br\&amp;gt;- Member&lt;br /&gt;
| - Von überall aus sichtbar &amp;lt;br\&amp;gt; - Von überall aus sichtbar &amp;lt;br\&amp;gt; - Von überall aus da sichtbar, wo auch die Klasse sichtbar ist&lt;br /&gt;
|-&lt;br /&gt;
| strictfp&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Methode&lt;br /&gt;
| - Alle Methoden in der Klasse gehen strikt nach der IEEE-Norm vor &amp;lt;br\&amp;gt;- Methode geht strikt nach der IEEE-Norm vor&lt;br /&gt;
|-&lt;br /&gt;
| static&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Methode &amp;lt;br\&amp;gt;- Objektvariablen &amp;lt;br\&amp;gt; - Initialisierer&lt;br /&gt;
| - Macht eine innere Klase zu einer Top-Level-Klasse &amp;lt;br\&amp;gt; - Die Klassenmethode wird durch den Klassennamen aufgerufen &amp;lt;br\&amp;gt;- Zugriff über Klassennamen &amp;lt;br\&amp;gt; - Wird aufgerufen beim Laden der Klasse&lt;br /&gt;
|-&lt;br /&gt;
| synchronized&lt;br /&gt;
| - Methode&lt;br /&gt;
| - Bei statischen Methoden: lock für die dazugehörige Klasse, bei nicht-statischen methoden: lock für die jeweilige Objekt-Instanz&lt;br /&gt;
|-&lt;br /&gt;
| transient&lt;br /&gt;
| - Objektvariable&lt;br /&gt;
| - Wird nicht mit dem Objekt serialisiert&lt;br /&gt;
|-&lt;br /&gt;
| volatile&lt;br /&gt;
| - Objektvariable&lt;br /&gt;
| - Zugriffe auf diese Variablen sind atomar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modifizierer: Alle Kombinationen ==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
! Modifizierer&lt;br /&gt;
! Klasse&lt;br /&gt;
! Variable&lt;br /&gt;
! Methode&lt;br /&gt;
! Konstruktor&lt;br /&gt;
|-&lt;br /&gt;
| public&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| protected&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| keiner(package/default)&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| private&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| final&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| abstract&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| static&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| nativ&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| transient&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| volatile&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| synchronized&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| strictfp&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Quelle: &amp;lt;br\&amp;gt;&lt;br /&gt;
[http://www.javacamp.org/javaI/Modifier.html Java Modifiers] &amp;lt;br\&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Java-Syntax Java-Syntax ? Wikipedia]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:eRaaaa|eRaaaa]] 13:08, 25. Dez 2009 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Zugriffsmodifizierer_(Java)&amp;diff=5708</id>
		<title>Zugriffsmodifizierer (Java)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Zugriffsmodifizierer_(Java)&amp;diff=5708"/>
		<updated>2013-09-17T11:11:31Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Zugriffsmodifizierer ==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
! Modifizierer&lt;br /&gt;
! Die Klasse selbst&lt;br /&gt;
! Paket-Klassen/innere-Klassen&lt;br /&gt;
! Unterklassen&lt;br /&gt;
! Sonstige Klassen&lt;br /&gt;
|-&lt;br /&gt;
| private&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| public&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| protected&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| ohne/leer&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modifizierer Übersicht ==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
! Modifizierer&lt;br /&gt;
! Anwendbar auf&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| abstract&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Interface &amp;lt;br\&amp;gt;- Methode&lt;br /&gt;
| - Kann nicht instanziiert werden &amp;lt;br\&amp;gt;- Interfaces sind immer abstrakt (modifier optional)&amp;lt;br\&amp;gt; - Hat keinen Body, enthält nur Signatur. (die umschließende Klasse ist selbst auch abstrakt)&lt;br /&gt;
|-&lt;br /&gt;
| final&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Methode &amp;lt;br\&amp;gt;- Objektvariablen&amp;lt;br\&amp;gt;- Variablen&lt;br /&gt;
| - Kann nicht erweitert werden &amp;lt;br\&amp;gt; - Kann nicht überschrieben werden&amp;lt;br\&amp;gt;- Können ihren Wert nicht ändern &amp;lt;br\&amp;gt;- Können ihren Wert nicht ändern&lt;br /&gt;
|-&lt;br /&gt;
| nativ&lt;br /&gt;
| - Methode&lt;br /&gt;
| - Plattform spezifisch (keine Signatur, kein Body)&lt;br /&gt;
|-&lt;br /&gt;
| leer/keiner(package)&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Interface &amp;lt;br\&amp;gt;- Member&lt;br /&gt;
| - Nur im eigenen Paket sichtbar &amp;lt;br\&amp;gt;- Nur im eigenen Paket sichtbar &amp;lt;br\&amp;gt; - Nur im eigenen Paket sichtbar&lt;br /&gt;
|-&lt;br /&gt;
| private&lt;br /&gt;
| - Member&lt;br /&gt;
| - Nur in dieser Klasse sichtbar (wo sie definiert wurde)&lt;br /&gt;
|-&lt;br /&gt;
| protected&lt;br /&gt;
| - Member&lt;br /&gt;
| - Im eigenen package sichtbar und in Subklassen&lt;br /&gt;
|-&lt;br /&gt;
| public&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Interface &amp;lt;br\&amp;gt;- Member&lt;br /&gt;
| - Von überall aus sichtbar &amp;lt;br\&amp;gt; - Von überall aus sichtbar &amp;lt;br\&amp;gt; - Von überall aus da sichtbar, wo auch die Klasse sichtbar ist&lt;br /&gt;
|-&lt;br /&gt;
| strictfp&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Methode&lt;br /&gt;
| - Alle Methoden in der Klasse gehen strikt nach der IEEE-Norm vor &amp;lt;br\&amp;gt;- Methode geht strikt nach der IEEE-Norm vor&lt;br /&gt;
|-&lt;br /&gt;
| static&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Methode &amp;lt;br\&amp;gt;- Objektvariablen &amp;lt;br\&amp;gt; - Initialisierer&lt;br /&gt;
| - Macht eine innere Klase zu einer Top-Level-Klasse &amp;lt;br\&amp;gt; - Die Klassenmethode wird durch den Klassennamen aufgerufen &amp;lt;br\&amp;gt;- Zugriff über Klassennamen &amp;lt;br\&amp;gt; - Wird aufgerufen beim Laden der Klasse&lt;br /&gt;
|-&lt;br /&gt;
| synchronized&lt;br /&gt;
| - Methode&lt;br /&gt;
| - Bei statischen Methoden: lock für die dazugehörige Klasse, bei nicht-statischen methoden: lock für die jeweilige Objekt-Instanz&lt;br /&gt;
|-&lt;br /&gt;
| transient&lt;br /&gt;
| - Objektvariable&lt;br /&gt;
| - Wird nicht mit dem Objekt serialisiert&lt;br /&gt;
|-&lt;br /&gt;
| volatile&lt;br /&gt;
| - Objektvariable&lt;br /&gt;
| - Zugriffe auf diese Variablen sind atomar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modifizierer: Alle Kombinationen ==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
! Modifizierer&lt;br /&gt;
! Klasse&lt;br /&gt;
! Variable&lt;br /&gt;
! Methode&lt;br /&gt;
! Konstruktor&lt;br /&gt;
|-&lt;br /&gt;
| public&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| protected&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| keiner(package/default)&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| private&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| final&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| abstract&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| static&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| nativ&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| transient&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| volatile&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| synchronized&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| strictfp&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Quelle: &amp;lt;br\&amp;gt;&lt;br /&gt;
[http://www.javacamp.org/javaI/Modifier.html Java Modifiers] &amp;lt;br\&amp;gt;&lt;br /&gt;
[http://de.wikipedia.org/wiki/Java-Syntax Java-Syntax ? Wikipedia]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Zugriffsmodifizierer_(Java)&amp;diff=5707</id>
		<title>Zugriffsmodifizierer (Java)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Zugriffsmodifizierer_(Java)&amp;diff=5707"/>
		<updated>2013-09-17T07:23:31Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Zugriffsmodifizierer ==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
! Modifizierer&lt;br /&gt;
! Die Klasse selbst&lt;br /&gt;
! Paket-Klassen/innere-Klassen&lt;br /&gt;
! Unterklassen&lt;br /&gt;
! Sonstige Klassen&lt;br /&gt;
|-&lt;br /&gt;
| private&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| public&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
|-&lt;br /&gt;
| protected&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
| ohne/leer&lt;br /&gt;
| ja&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
| nein&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modifizierer Übersicht ==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
! Modifizierer&lt;br /&gt;
! Anwendbar auf&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| abstract&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Interface &amp;lt;br\&amp;gt;- Methode&lt;br /&gt;
| - Kann nicht instanziiert werden &amp;lt;br\&amp;gt;- Interfaces sind immer abstrakt (modifier optional)&amp;lt;br\&amp;gt; - Hat keinen Body, enthält nur Signatur. (die umschließende Klasse ist selbst auch abstrakt)&lt;br /&gt;
|-&lt;br /&gt;
| final&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Methode &amp;lt;br\&amp;gt;- Objektvariablen&amp;lt;br\&amp;gt;- Variablen&lt;br /&gt;
| - Kann nicht erweitert werden &amp;lt;br\&amp;gt; - Kann nicht überschrieben werden&amp;lt;br\&amp;gt;- Können ihren Wert nicht ändern &amp;lt;br\&amp;gt;- Können ihren Wert nicht ändern&lt;br /&gt;
|-&lt;br /&gt;
| nativ&lt;br /&gt;
| - Methode&lt;br /&gt;
| - Plattform spezifisch (keine Signatur, kein Body)&lt;br /&gt;
|-&lt;br /&gt;
| leer/keiner(package)&lt;br /&gt;
| - Klasse &amp;lt;br\&amp;gt;- Interface &amp;lt;br\&amp;gt;- Member&lt;br /&gt;
| - Nur im eigenen Paket sichtbar &amp;lt;br\&amp;gt;- Nur im eigenen Paket sichtbar &amp;lt;br\&amp;gt; - Nur im eigenen Paket sichtbar&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Zugriffsmodifizierer_(Java)&amp;diff=5706</id>
		<title>Zugriffsmodifizierer (Java)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Zugriffsmodifizierer_(Java)&amp;diff=5706"/>
		<updated>2013-09-17T07:06:13Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde neu angelegt: „Zugriffsmodifizierer“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zugriffsmodifizierer&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Was_ist_eine_Exception%3F&amp;diff=5705</id>
		<title>Was ist eine Exception?</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Was_ist_eine_Exception%3F&amp;diff=5705"/>
		<updated>2013-09-17T07:00:22Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine Exception ist eine Ausnahmesituation, die normalerweise durch Fehler hervorgerufen wird. Diese Ausnahmen führen in der Regel zu einer Änderung des Programmablaufs, um etwa den Fehler zu beheben oder das Programm in einen sicheren &lt;br /&gt;
Zustand zu bringen.&lt;br /&gt;
&lt;br /&gt;
[http://java.sun.com/docs/books/tutorial/essential/exceptions/ Lesson: Exceptions (The Java™ Tutorials &amp;gt; Essential Classes)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist der Unterschied zwischen checked und unchecked Exceptions? ==&lt;br /&gt;
&lt;br /&gt;
Unchecked Exceptions sind von der Klasse &amp;lt;code=intern&amp;gt;RuntimeException&amp;lt;/code=intern&amp;gt; oder einer deren Unterklassen&lt;br /&gt;
abgeleitet. Sie müssen nicht explizit behandelt (mit catch gefangen) oder mit throws weitergeworfen werden.&lt;br /&gt;
&lt;br /&gt;
Checked Exceptions sind nicht von &amp;lt;code=intern&amp;gt;RuntimeException&amp;lt;/code=intern&amp;gt; abgeleitet. Kann eine Methode eine&lt;br /&gt;
checked Exception werfen, so muss sie entweder behandelt werden (try-catch) oder die&lt;br /&gt;
aufrufende Methode muss sie in der throws-Klausel deklarieren. D. h. die Exception wird weiter geworfen.&lt;br /&gt;
&lt;br /&gt;
Die Begriffe &#039;&#039;Runtime-Exception&#039;&#039; und &#039;&#039;unchecked Exception&#039;&#039; können synonym verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public void methodeMitRuntimeException() {&lt;br /&gt;
    throw new NullPointerException();    // NullPointerException ist eine RuntimeException&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void methodeMitCheckedExceptionBehandelt() {&lt;br /&gt;
    try {&lt;br /&gt;
         foo(); // foo() kann IOException werfen. IOException ist eine checked Exception.&lt;br /&gt;
    }&lt;br /&gt;
    catch(IOException ex) {&lt;br /&gt;
         //... Exception behandeln&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void methodeMitCheckedExceptionWeiterwerfen() throws IOException {    &lt;br /&gt;
    foo(); // foo() kann IOException werfen. IOException ist eine checked Exception.&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie behandle ich eine Exception richtig? ==&lt;br /&gt;
&lt;br /&gt;
Eine Exception sollte auf keinen Fall einfach verschluckt werden. Eine Fehlerausgabe, Logging der Exception oder ein Weiterwerfen sollten vorhanden sein. &lt;br /&gt;
Auch ist davon abzuraten, generell alle Exceptions in einem catch abzufangen. Es sollten immer nur konkrete Ausnahmen gefangen werden. &lt;br /&gt;
Dies verhindert, dass man &amp;quot;aus Versehen&amp;quot; eine Exception fängt, die gar nicht behandelt werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public void foo() {&lt;br /&gt;
    try {&lt;br /&gt;
         methodeDieExceptionsWirft();&lt;br /&gt;
    }&lt;br /&gt;
    catch(Exception x) {    // FALSCH! Nicht alle Exceptions auf einmal fangen! &lt;br /&gt;
                            // FALSCH! Exceptions nicht ignorieren!&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void bar() {&lt;br /&gt;
    try {&lt;br /&gt;
         methodeDieExceptionsWirft();&lt;br /&gt;
    }&lt;br /&gt;
    catch(FileNotFoundException fnfex) {            // RICHTIG: konkrete Exceptions einzeln angeben&lt;br /&gt;
         myExceptionHandler.handleException(x);    &lt;br /&gt;
    }&lt;br /&gt;
    catch(SQLException sqlex) {                     &lt;br /&gt;
         sqlex.printStacktrace();                   // OK: Stacktrace auf Konsole ausgeben&lt;br /&gt;
         LOGGER.error(sqlex);                       // BESSER: Exception loggen&lt;br /&gt;
    }&lt;br /&gt;
    catch(ParseException pex) {&lt;br /&gt;
         throw new RuntimeException(&amp;quot;unerwartete Exception&amp;quot;, pex);  // OK: checked Exception in RTEx kapseln&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wann soll ich Runtime-Exceptions und wann checked Exceptions verwenden? ==&lt;br /&gt;
&lt;br /&gt;
Checked Exceptions zwingen den Aufrufer zur sofortigen Behandlung bzw. expliziten Weiterleitung&lt;br /&gt;
der Exception. Dies ist nur sinnvoll, wenn eine Chance besteht, die Ausnahmesituation zu&lt;br /&gt;
reparieren (&amp;quot;reasonably be expected to recover&amp;quot; [http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html [1]]). Andernfalls gibt es nur die Möglichkeit,&lt;br /&gt;
dem Anwender eine Fehlermeldung zu präsentieren, die Exception zu loggen oder die Anwendung&lt;br /&gt;
kontrolliert zu beenden. In solchen Fällen sind ungeprüfte Ausnahmen (Runtime-Exceptions) vorzuziehen.&lt;br /&gt;
&lt;br /&gt;
[http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html Unchecked Exceptions — The Controversy (The Java™ Tutorials &amp;gt; Essential Classes &amp;gt; Exceptions)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stimmt es, dass RuntimeExceptions immer auf Programmierfehler hindeuten und nie gefangen werden sollten? ==&lt;br /&gt;
&lt;br /&gt;
Ursprünglich stimmte das, wenn man nur die vordefinierten Exception in der Java API betrachtet. Ausnahmen&lt;br /&gt;
wie NullPointerException, ArrayIndexOutOfBoundsException oder IllegalArgumentException deuten wirklich&lt;br /&gt;
auf Programmierfehler hin, die in funktionierenden Programmen nie auftreten sollten. Falls doch, sollte&lt;br /&gt;
der Bug behoben werden, statt die Exception zu behandeln.&lt;br /&gt;
&lt;br /&gt;
Andererseits gehen Frameworks und Software-Bibliotheken mehr und mehr dazu über, nur noch unchecked Exceptions&lt;br /&gt;
zu benutzen. Diese sind in der Regel nicht durch Programmierfehler bedingt. So wirft das Persistenz-Framework&lt;br /&gt;
Hibernate eine Runtime-Exception, wenn beispielsweise die Datenbank nicht verfügbar ist. &lt;br /&gt;
Solche Ausnahmen können natürlich auch gefangen und behandelt werden, wenn dies möglich und sinnvoll ist.&lt;br /&gt;
&lt;br /&gt;
Eine Gleichsetzung Runtime-Exceptions == Programmierfehler kann also nicht verallgemeinert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist das Problem mit checked Exceptions? ==&lt;br /&gt;
&lt;br /&gt;
Checked Exceptions sind nur dann sinnvoll, wenn bei ihrem Auftreten unmittelbar die Möglichkeit besteht, die &lt;br /&gt;
Ausnahmesituation zu beheben und dem Programmablauf normal fortzufahren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;- Checked Exceptions führen zu überflüssigem Code&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Praxis sind Fälle, in denen man auf jeden Fall von einer Behebbarkeit ausgehen kann, jedoch sehr selten. &lt;br /&gt;
Trotzdem wird er Entwickler gezwungen, die Exception (unnötigerweise) zu behandeln, da sonst der Code&lt;br /&gt;
nicht kompilierbar ist. Da führt zu eigentlich überflüssigen try-catch-Anweisungen, die den Quelltext länger&lt;br /&gt;
und schwerer zu lesen machen. Im schlimmsten Fall wird die Exception einfach nur verschluckt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;- Behebbare Ausnahmen sind selten und oft nicht eindeutig zu identifizieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
IOException auf der Java Standard-API ist eine checked Exception, sie muss also behandelt werden. In einigen&lt;br /&gt;
Anwendungsfällen ist dies natürlich möglich. Hat der Anwender beispielsweise einen falschen Dateinamen&lt;br /&gt;
eingetippt, so kann man den entsprechenden Eingabedialog erneut öffnen und den richtigen Dateinamen verlangen.&lt;br /&gt;
Diese Situation ist behebbar.&lt;br /&gt;
Was soll aber passieren, wenn IOException in einem Server-Prozess fliegt, etwa, weil die Konfigurationsdatei&lt;br /&gt;
der Servers nicht gelesen werden kann oder kein freier Festplattenspeicher mehr verfügbar ist. Diese&lt;br /&gt;
Situationen sind nicht behebbar. Es bleibt einem nichts anderes übrig, als die Exception zu loggen, ggf. den &lt;br /&gt;
Administrator zu verständigen und das Programm zu beenden. &lt;br /&gt;
IOException kann also nicht immer sinnvoll behandelt werden. Daraus folgt, dass sie eigentlich keine checked Exception&lt;br /&gt;
sein sollte, sondern eine Runtime-Exception.&lt;br /&gt;
&lt;br /&gt;
Generell sollten Frameworks oder allgemein verwendbare Bibliotheken keine checked Exceptions verwenden. In abgeschlossenen&lt;br /&gt;
Software-Systemen (Individualsoftware) können geprüfte Ausnahmen manchmal sinnvoll sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;- Checked Exceptions verschmutzen Interfaces und führen zu hoher Kopplung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Das Service-Interface von Java RMI verlangt von jeder Methode, die checked Exception RemoteException in der&lt;br /&gt;
throws-Klausel zu deklarieren. Dadurch wird es hart an diese Technologie gekoppelt. Soll zum Beispiel &lt;br /&gt;
in Zukunft RMI durch ein anderes Remote-Procedure-Call Produkt ausgetauscht werden, sind umfangreiche &lt;br /&gt;
Änderungen am Quelltext notwendig, um überall die RemoteExceptions und die entsprechenden catch-Blöcke&lt;br /&gt;
zu entfernen.&lt;br /&gt;
Umgekehrt ist es noch schlimmer: Besteht bereits ein Service-Interface, das im Programm verwendet wird, und&lt;br /&gt;
soll es jetzt durch RMI implementiert werden, so muss man entsprechend throws RemoteException an allen&lt;br /&gt;
Methoden hinzufügen. An sämtlichen aufrufenden Stellen muss darüber hinaus die Exceptionbehandlung&lt;br /&gt;
ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Warum dann überhaupt checked Exceptions? ==&lt;br /&gt;
&lt;br /&gt;
Gute Frage. Der Nutzen von checked Exceptions hat sich als sehr begrenzt heraus gestellt. Die &lt;br /&gt;
Nachteile durch das (gezwungene) Behandeln (mehr Quelltext, eventuell Verschlucken der Exception, siehe oben),&lt;br /&gt;
können Probleme verursachen. Es gibt einen Trend weg von checked Exceptions, z.B. werden in Hibernate&lt;br /&gt;
und Spring-Framework nur noch Runtime-Exceptions verwendet. &lt;br /&gt;
Das Konzept der checked Exceptions gibt es so nur in Java. In neueren, auch von Java inspirierten Sprachen&lt;br /&gt;
wie C# oder Groovy, wurde darauf verzichtet. &lt;br /&gt;
&lt;br /&gt;
[http://www.javaspecialists.eu/archive/Issue033.html JavaSpecialists 033 - Making Exceptions Unchecked] &amp;lt;br\&amp;gt;&lt;br /&gt;
[http://radio.weblogs.com/0122027/stories/2003/04/01/JavasCheckedExceptionsWereAMistake.html Java&#039;s checked exceptions were a mistake (and here&#039;s what I would like to do about it)]&amp;lt;br\&amp;gt;&lt;br /&gt;
[http://www.mindview.net/Etc/Discussions/CheckedExceptions Bruce Eckel&#039;s MindView, Inc: Does Java need Checked Exceptions?]&amp;lt;br\&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was tun mit all den unbehandelten Exceptions? ==&lt;br /&gt;
&lt;br /&gt;
Runtime-Exceptions die nicht mit catch gefangen und behandelt werden, nennt man uncaught Exceptions. Seit Java 1.5&lt;br /&gt;
hat man die Möglichkeit, für jeden Thread einen [http://java.sun.com/javase/6/docs/api/java/lang/Thread.UncaughtExceptionHandler.html UncaughtExceptionHandler] zu installieren. Darüber hinaus&lt;br /&gt;
gibt es einen globalen [http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) Default-UncaughtExceptionHandler], der standardmäßig verwendet wird, falls kein Thread-spezifischer gesetzt wurde.&lt;br /&gt;
Hier kann zentral festgelegt werden, was mit solchen Ausnahmen geschehen soll, beispielsweise die Darstellung&lt;br /&gt;
eines Fehlerdialogs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wieso heißt es RuntimeException? Alle Exceptions fliegen doch zur Laufzeit. ==&lt;br /&gt;
&lt;br /&gt;
Das ist richtig. Ursprünglich unterschied man zwischen Exceptions, die explizit vom&lt;br /&gt;
Programmierer erzeugt und geworfen werden und solchen, die von&lt;br /&gt;
der Java Laufzeitumgebung (JRE), also der Virtuellen Maschine, implizit erzeugt werden.&lt;br /&gt;
Wenn zum Beispiel versucht wird, eine Null-Referenz zu dereferenzieren oder über&lt;br /&gt;
die Grenzen eines Arrays hinaus zuzugreifen, wirft die Java Laufzeitumgebung automatisch&lt;br /&gt;
eine entsprechende Exception. Daher der Name RuntimeException.&lt;br /&gt;
&lt;br /&gt;
Rein praktisch können RuntimeException natürlich auch explizit vom Programmierer erzeugt und&lt;br /&gt;
geworfen werden, ganz genau wie geprüfte Ausnahmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist ein Error? ==&lt;br /&gt;
&lt;br /&gt;
Ein Error ist auch eine Art Exception, die eine schwere Ausnahmesituation darstellt. Sie kann in der Regel nicht&lt;br /&gt;
behoben werden (z.B. OutOfMemoryError). Ähnlich wie RuntimeExceptions müssen Errors weder gefangen noch mit&lt;br /&gt;
der throws-Klausel deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist Throwable? ==&lt;br /&gt;
&lt;br /&gt;
Throwable ist die Oberklasse für alle Exceptions, RuntimeExceptions und Errors - also alles, was geworfen werden kann.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:tfa|tfa]] 13:08, 30. Juli 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Was_ist_eine_Exception%3F&amp;diff=5704</id>
		<title>Was ist eine Exception?</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Was_ist_eine_Exception%3F&amp;diff=5704"/>
		<updated>2013-09-17T06:57:08Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde neu angelegt: „Eine Exception ist eine Ausnahmesituation, die normalerweise durch Fehler hervorgerufen wird. Diese Ausnahmen führen in der Regel zu einer Änderung des Programm…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine Exception ist eine Ausnahmesituation, die normalerweise durch Fehler hervorgerufen wird. Diese Ausnahmen führen in der Regel zu einer Änderung des Programmablaufs, um etwa den Fehler zu beheben oder das Programm in einen sicheren &lt;br /&gt;
Zustand zu bringen.&lt;br /&gt;
&lt;br /&gt;
[http://java.sun.com/docs/books/tutorial/essential/exceptions/ Lesson: Exceptions (The Java™ Tutorials &amp;gt; Essential Classes)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist der Unterschied zwischen checked und unchecked Exceptions? ==&lt;br /&gt;
&lt;br /&gt;
Unchecked Exceptions sind von der Klasse &amp;lt;code=intern&amp;gt;RuntimeException&amp;lt;/code=intern&amp;gt; oder einer deren Unterklassen&lt;br /&gt;
abgeleitet. Sie müssen nicht explizit behandelt (mit catch gefangen) oder mit throws weitergeworfen werden.&lt;br /&gt;
&lt;br /&gt;
Checked Exceptions sind nicht von &amp;lt;code=intern&amp;gt;RuntimeException&amp;lt;/code=intern&amp;gt; abgeleitet. Kann eine Methode eine&lt;br /&gt;
checked Exception werfen, so muss sie entweder behandelt werden (try-catch) oder die&lt;br /&gt;
aufrufende Methode muss sie in der throws-Klausel deklarieren. D. h. die Exception wird weiter geworfen.&lt;br /&gt;
&lt;br /&gt;
Die Begriffe &#039;&#039;Runtime-Exception&#039;&#039; und &#039;&#039;unchecked Exception&#039;&#039; können synonym verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public void methodeMitRuntimeException() {&lt;br /&gt;
    throw new NullPointerException();    // NullPointerException ist eine RuntimeException&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void methodeMitCheckedExceptionBehandelt() {&lt;br /&gt;
    try {&lt;br /&gt;
         foo(); // foo() kann IOException werfen. IOException ist eine checked Exception.&lt;br /&gt;
    }&lt;br /&gt;
    catch(IOException ex) {&lt;br /&gt;
         //... Exception behandeln&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void methodeMitCheckedExceptionWeiterwerfen() throws IOException {    &lt;br /&gt;
    foo(); // foo() kann IOException werfen. IOException ist eine checked Exception.&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie behandle ich eine Exception richtig? ==&lt;br /&gt;
&lt;br /&gt;
Eine Exception sollte auf keinen Fall einfach verschluckt werden. Eine Fehlerausgabe, Logging der Exception oder ein Weiterwerfen sollten vorhanden sein. &lt;br /&gt;
Auch ist davon abzuraten, generell alle Exceptions in einem catch abzufangen. Es sollten immer nur konkrete Ausnahmen gefangen werden. &lt;br /&gt;
Dies verhindert, dass man &amp;quot;aus Versehen&amp;quot; eine Exception fängt, die gar nicht behandelt werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public void foo() {&lt;br /&gt;
    try {&lt;br /&gt;
         methodeDieExceptionsWirft();&lt;br /&gt;
    }&lt;br /&gt;
    catch(Exception x) {    // FALSCH! Nicht alle Exceptions auf einmal fangen! &lt;br /&gt;
                            // FALSCH! Exceptions nicht ignorieren!&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
public void bar() {&lt;br /&gt;
    try {&lt;br /&gt;
         methodeDieExceptionsWirft();&lt;br /&gt;
    }&lt;br /&gt;
    catch(FileNotFoundException fnfex) {            // RICHTIG: konkrete Exceptions einzeln angeben&lt;br /&gt;
         myExceptionHandler.handleException(x);    &lt;br /&gt;
    }&lt;br /&gt;
    catch(SQLException sqlex) {                     &lt;br /&gt;
         sqlex.printStacktrace();                   // OK: Stacktrace auf Konsole ausgeben&lt;br /&gt;
         LOGGER.error(sqlex);                       // BESSER: Exception loggen&lt;br /&gt;
    }&lt;br /&gt;
    catch(ParseException pex) {&lt;br /&gt;
         throw new RuntimeException(&amp;quot;unerwartete Exception&amp;quot;, pex);  // OK: checked Exception in RTEx kapseln&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wann soll ich Runtime-Exceptions und wann checked Exceptions verwenden? ==&lt;br /&gt;
&lt;br /&gt;
Checked Exceptions zwingen den Aufrufer zur sofortigen Behandlung bzw. expliziten Weiterleitung&lt;br /&gt;
der Exception. Dies ist nur sinnvoll, wenn eine Chance besteht, die Ausnahmesituation zu&lt;br /&gt;
reparieren (&amp;quot;reasonably be expected to recover&amp;quot; [http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html [1]]). Andernfalls gibt es nur die Möglichkeit,&lt;br /&gt;
dem Anwender eine Fehlermeldung zu präsentieren, die Exception zu loggen oder die Anwendung&lt;br /&gt;
kontrolliert zu beenden. In solchen Fällen sind ungeprüfte Ausnahmen (Runtime-Exceptions) vorzuziehen.&lt;br /&gt;
&lt;br /&gt;
[http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html Unchecked Exceptions — The Controversy (The Java™ Tutorials &amp;gt; Essential Classes &amp;gt; Exceptions)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stimmt es, dass RuntimeExceptions immer auf Programmierfehler hindeuten und nie gefangen werden sollten? ==&lt;br /&gt;
&lt;br /&gt;
Ursprünglich stimmte das, wenn man nur die vordefinierten Exception in der Java API betrachtet. Ausnahmen&lt;br /&gt;
wie NullPointerException, ArrayIndexOutOfBoundsException oder IllegalArgumentException deuten wirklich&lt;br /&gt;
auf Programmierfehler hin, die in funktionierenden Programmen nie auftreten sollten. Falls doch, sollte&lt;br /&gt;
der Bug behoben werden, statt die Exception zu behandeln.&lt;br /&gt;
&lt;br /&gt;
Andererseits gehen Frameworks und Software-Bibliotheken mehr und mehr dazu über, nur noch unchecked Exceptions&lt;br /&gt;
zu benutzen. Diese sind in der Regel nicht durch Programmierfehler bedingt. So wirft das Persistenz-Framework&lt;br /&gt;
Hibernate eine Runtime-Exception, wenn beispielsweise die Datenbank nicht verfügbar ist. &lt;br /&gt;
Solche Ausnahmen können natürlich auch gefangen und behandelt werden, wenn dies möglich und sinnvoll ist.&lt;br /&gt;
&lt;br /&gt;
Eine Gleichsetzung Runtime-Exceptions == Programmierfehler kann also nicht verallgemeinert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist das Problem mit checked Exceptions? ==&lt;br /&gt;
&lt;br /&gt;
Checked Exceptions sind nur dann sinnvoll, wenn bei ihrem Auftreten unmittelbar die Möglichkeit besteht, die &lt;br /&gt;
Ausnahmesituation zu beheben und dem Programmablauf normal fortzufahren. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;- Checked Exceptions führen zu überflüssigem Code&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Praxis sind Fälle, in denen man auf jeden Fall von einer Behebbarkeit ausgehen kann, jedoch sehr selten. &lt;br /&gt;
Trotzdem wird er Entwickler gezwungen, die Exception (unnötigerweise) zu behandeln, da sonst der Code&lt;br /&gt;
nicht kompilierbar ist. Da führt zu eigentlich überflüssigen try-catch-Anweisungen, die den Quelltext länger&lt;br /&gt;
und schwerer zu lesen machen. Im schlimmsten Fall wird die Exception einfach nur verschluckt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;- Behebbare Ausnahmen sind selten und oft nicht eindeutig zu identifizieren&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
IOException auf der Java Standard-API ist eine checked Exception, sie muss also behandelt werden. In einigen&lt;br /&gt;
Anwendungsfällen ist dies natürlich möglich. Hat der Anwender beispielsweise einen falschen Dateinamen&lt;br /&gt;
eingetippt, so kann man den entsprechenden Eingabedialog erneut öffnen und den richtigen Dateinamen verlangen.&lt;br /&gt;
Diese Situation ist behebbar.&lt;br /&gt;
Was soll aber passieren, wenn IOException in einem Server-Prozess fliegt, etwa, weil die Konfigurationsdatei&lt;br /&gt;
der Servers nicht gelesen werden kann oder kein freier Festplattenspeicher mehr verfügbar ist. Diese&lt;br /&gt;
Situationen sind nicht behebbar. Es bleibt einem nichts anderes übrig, als die Exception zu loggen, ggf. den &lt;br /&gt;
Administrator zu verständigen und das Programm zu beenden. &lt;br /&gt;
IOException kann also nicht immer sinnvoll behandelt werden. Daraus folgt, dass sie eigentlich keine checked Exception&lt;br /&gt;
sein sollte, sondern eine Runtime-Exception.&lt;br /&gt;
&lt;br /&gt;
Generell sollten Frameworks oder allgemein verwendbare Bibliotheken keine checked Exceptions verwenden. In abgeschlossenen&lt;br /&gt;
Software-Systemen (Individualsoftware) können geprüfte Ausnahmen manchmal sinnvoll sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;- Checked Exceptions verschmutzen Interfaces und führen zu hoher Kopplung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Das Service-Interface von Java RMI verlangt von jeder Methode, die checked Exception RemoteException in der&lt;br /&gt;
throws-Klausel zu deklarieren. Dadurch wird es hart an diese Technologie gekoppelt. Soll zum Beispiel &lt;br /&gt;
in Zukunft RMI durch ein anderes Remote-Procedure-Call Produkt ausgetauscht werden, sind umfangreiche &lt;br /&gt;
Änderungen am Quelltext notwendig, um überall die RemoteExceptions und die entsprechenden catch-Blöcke&lt;br /&gt;
zu entfernen.&lt;br /&gt;
Umgekehrt ist es noch schlimmer: Besteht bereits ein Service-Interface, das im Programm verwendet wird, und&lt;br /&gt;
soll es jetzt durch RMI implementiert werden, so muss man entsprechend throws RemoteException an allen&lt;br /&gt;
Methoden hinzufügen. An sämtlichen aufrufenden Stellen muss darüber hinaus die Exceptionbehandlung&lt;br /&gt;
ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Warum dann überhaupt checked Exceptions? ==&lt;br /&gt;
&lt;br /&gt;
Gute Frage. Der Nutzen von checked Exceptions hat sich als sehr begrenzt heraus gestellt. Die &lt;br /&gt;
Nachteile durch das (gezwungene) Behandeln (mehr Quelltext, eventuell Verschlucken der Exception, siehe oben),&lt;br /&gt;
können Probleme verursachen. Es gibt einen Trend weg von checked Exceptions, z.B. werden in Hibernate&lt;br /&gt;
und Spring-Framework nur noch Runtime-Exceptions verwendet. &lt;br /&gt;
Das Konzept der checked Exceptions gibt es so nur in Java. In neueren, auch von Java inspirierten Sprachen&lt;br /&gt;
wie C# oder Groovy, wurde darauf verzichtet. &lt;br /&gt;
&lt;br /&gt;
[http://www.javaspecialists.eu/archive/Issue033.html JavaSpecialists 033 - Making Exceptions Unchecked] &amp;lt;br\&amp;gt;&lt;br /&gt;
[http://radio.weblogs.com/0122027/stories/2003/04/01/JavasCheckedExceptionsWereAMistake.html Java&#039;s checked exceptions were a mistake (and here&#039;s what I would like to do about it)]&amp;lt;br\&amp;gt;&lt;br /&gt;
[http://www.mindview.net/Etc/Discussions/CheckedExceptions Bruce Eckel&#039;s MindView, Inc: Does Java need Checked Exceptions?]&amp;lt;br\&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was tun mit all den unbehandelten Exceptions? ==&lt;br /&gt;
&lt;br /&gt;
Runtime-Exceptions die nicht mit catch gefangen und behandelt werden, nennt man uncaught Exceptions. Seit Java 1.5&lt;br /&gt;
hat man die Möglichkeit, für jeden Thread einen [http://java.sun.com/javase/6/docs/api/java/lang/Thread.UncaughtExceptionHandler.html UncaughtExceptionHandler] zu installieren. Darüber hinaus&lt;br /&gt;
gibt es einen globalen [http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) Default-UncaughtExceptionHandler], der standardmäßig verwendet wird, falls kein Thread-spezifischer gesetzt wurde.&lt;br /&gt;
Hier kann zentral festgelegt werden, was mit solchen Ausnahmen geschehen soll, beispielsweise die Darstellung&lt;br /&gt;
eines Fehlerdialogs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wieso heißt es RuntimeException? Alle Exceptions fliegen doch zur Laufzeit. ==&lt;br /&gt;
&lt;br /&gt;
Das ist richtig. Ursprünglich unterschied man zwischen Exceptions, die explizit vom&lt;br /&gt;
Programmierer erzeugt und geworfen werden und solchen, die von&lt;br /&gt;
der Java Laufzeitumgebung (JRE), also der Virtuellen Maschine, implizit erzeugt werden.&lt;br /&gt;
Wenn zum Beispiel versucht wird, eine Null-Referenz zu dereferenzieren oder über&lt;br /&gt;
die Grenzen eines Arrays hinaus zuzugreifen, wirft die Java Laufzeitumgebung automatisch&lt;br /&gt;
eine entsprechende Exception. Daher der Name RuntimeException.&lt;br /&gt;
&lt;br /&gt;
Rein praktisch können RuntimeException natürlich auch explizit vom Programmierer erzeugt und&lt;br /&gt;
geworfen werden, ganz genau wie geprüfte Ausnahmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist ein Error? ==&lt;br /&gt;
&lt;br /&gt;
Ein Error ist auch eine Art Exception, die eine schwere Ausnahmesituation darstellt. Sie kann in der Regel nicht&lt;br /&gt;
behoben werden (z.B. OutOfMemoryError). Ähnlich wie RuntimeExceptions müssen Errors weder gefangen noch mit&lt;br /&gt;
der throws-Klausel deklariert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist Throwable? ==&lt;br /&gt;
&lt;br /&gt;
Throwable ist die Oberklasse für alle Exceptions, RuntimeExceptions und Errors - also alles, was geworfen werden kann.&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5605</id>
		<title>GroupLayout für Homosapiens</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=GroupLayout_f%C3%BCr_Homosapiens&amp;diff=5605"/>
		<updated>2013-09-02T17:20:14Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde neu angelegt: „== GroupLayout für Homosapiens: ==  Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GroupLayout für Homosapiens: ==&lt;br /&gt;
&lt;br /&gt;
Das GroupLayout ist ein mächtiger LayoutManager, der leider oft als komplizierter missverstanden wird, als er eigentlich ist. Besonders GUI-Builder erzeugen meist sehr hässlichen Code mit dem Grouplayout, weshalb ich euch rate erst mal ein GroupLayout von Hand zu schreiben.&lt;br /&gt;
GroupLayout wurde mit dem Ziel geschaffen, von GUI Buildern verwendet zu werden, von Hand programmiert, liegt der Schreibaufwand etwa wie beim GridBagLayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einem JPanel ein GroupLayout zu verpassen funktioniert erstmal nicht ganz genauso wie bei anderen LayoutManagern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JPanel panel=new JPanel();&lt;br /&gt;
GroupLayout layout = new GroupLayout(panel);&lt;br /&gt;
panel.setLayout(layout);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das GroupLayout wirft sehr schnell mal Exceptions wenn bei der initialisierung etwas schief gelaufen ist (z.B ein Komponent vergessen). Davon nicht abschrecken lassen! Andere LayoutManager kaschieren manche Ungereimtheiten und zeigen trotzdem was an. Das GroupLayout ist da wohl eher auf Perfektionismus ausgelegt: richtig oder gar nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zu den Komponenten: ==&lt;br /&gt;
&lt;br /&gt;
Auch hier geht das GroupLayout wieder einen eigenen Weg: Komponenten werden nicht per panel.add(Component c) &amp;quot;hinzugefügt&amp;quot;.&lt;br /&gt;
Man fasst die Komponenten in Gruppen zusammen und setzt diese in Beziehungen zueinander.&lt;br /&gt;
Anders als bei den GridBagConstraints wurde beim GroupLayout dieses &amp;quot;Beziehungen setzen&amp;quot; aber zweigeteilt: Man gibt die Größenverhältnisse einmal vertikal und einmal horizontal an:&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir imitieren ein FlowLayout mit 3 Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;JLabel label1=new JLabel(&amp;quot;1&amp;quot;);&lt;br /&gt;
JLabel label2=new JLabel(&amp;quot;2&amp;quot;);&lt;br /&gt;
JLabel label3=new JLabel(&amp;quot;3&amp;quot;);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1. Beziehungen auf vertikaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Wir wollen, dass alle 3 Labels in der gleichen Zeile stehen. Sehen wir von &amp;quot;Norden&amp;quot; aus auf unser Layout drauf (man beuge sich über den Bildschirm und blicke nach unten), sind die 3 Labels nebeneinander. Wenn wir 2 oder mehr Komponenten nebeneinander ausrichten wollen, benötigen wir eine ParallelGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup verticalGroup=layout.createParallelGroup();&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser ParallelGroup werden jetzt die Komponenten hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Beziehungen auf horizontaler Ebene: ===&lt;br /&gt;
&lt;br /&gt;
Sehen wir von &amp;quot;Westen&amp;quot; auf unser Layout (man stelle sich links neben den Bildschirm und blicke hinein), sind die 3 Labels hintereinander. Dafür gibts die SequentialGroup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup horizontalGroup=layout.createSequentialGroup;&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addComponent(label1).addComponent(label2).addComponent(label3);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss müssen wir unsere erstellten Gruppen noch dem Layout mit folgenden Methoden zuweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setVerticalGroup(verticalGroup);&lt;br /&gt;
layout.setHorizontalGroup(horizontalGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt noch panel in einen JFrame packen und fertig, unser erstes GroupLayout läuft! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn du einen Komponenten nur zu einer Group addest, fliegt eine Exception und es wird nichts angezeigt!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VerticalFlowLayout ==&lt;br /&gt;
&lt;br /&gt;
Wie siehts nun mit komplexeren Masken aus? Ich hab früher versucht aus zig verschiedenen, verschachtelten Panels jeweils mit eigenen einfachen LayoutManagern eine GUI zusammenzubasteln. Der Aufwand war enorm, die Übersichtlichkeit schrecklich, es war fehleranfällig und meist kam sowieso nicht das raus was gewollt war.&lt;br /&gt;
Mit dem GroupLayout kannst du dir das Panel verschachteln sparen, du verschachtelst die Groups.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir erweitern unser VerticalFlowGroupLayout: Da soll in jede Zeile noch zusätzlich ein Textfeld und ein Button rein:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1. Vertikale Group: ===&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns wieder vor, wir blicken von oben in unser Layout rein. Jetzt gibt’s zwei Betrachtungsweisen: Haben wir 3 Zeilen hintereinander, in denen je ein Label, ein Textfeld und ein Button nebeneinander stehen oder haben wir 3 Spalten nebeneinander mit jeweils 3 Labels, Textfeldern und Buttons hintereinander?&lt;br /&gt;
Die Entscheidung bleibt dir überlassen, ich werde es hier anhand des „3 Zeilen“ Ansatzes demonstrieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;SequentialGroup verticalGroup=layout.createSequentialGroup();&lt;br /&gt;
        &lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. Horizontale Group ===&lt;br /&gt;
&lt;br /&gt;
Analog zur Vertikalen Group: Haben wir 3 Zeilen nebeneinander in denen Label, Textfeld und Button hintereinander stehen oder haben wir 3 Spalten hintereinander, in denen untereinander je 3 Labels, Textfelder oder Buttons stehen?&lt;br /&gt;
W man sich beim Vertikalen Teil für die Zeilen Denkweise entschieden hat, ist es mMn sinnvoll dabei zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup horizontalGroup=layout.createParallelGroup();&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1).addComponent(textField1).addComponent(button1)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2).addComponent(textField2).addComponent(button2)&lt;br /&gt;
                );&lt;br /&gt;
        horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3).addComponent(textField3).addComponent(button3)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In meinem StandardFrame mit fixer Größe sieht das ganze nun aber so aus:&lt;br /&gt;
&lt;br /&gt;
Die Komponenten füllen den gesamten Platz der aus – wir brauchen sowas wie einen Glue aus dem BoxLayout. Im GroupLayout heißt das Gap.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gaps und Größenangaben ==&lt;br /&gt;
&lt;br /&gt;
Erstens gibt’s da mal eine Komfortfunktion die man ich eigentlich immer aktiviert habe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.setAutoCreateGaps(true);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kleben die Komponenten nicht mehr so aneinander, wie man das auch vom GridLayout her kennt.&lt;br /&gt;
&lt;br /&gt;
Zu unserm Problem, wir können Gaps genauso wie Komponenten einer Gruppe hinzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(Short.MAX_VALUE);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addGap erwartet einen Integer Wert als Parameter, der angibt wie groß der Gap sein soll. Short.MAX_VALUE liegt bei ca. 32000, so große Displays gibt’s noch nicht.&lt;br /&gt;
&lt;br /&gt;
Man kann addGap aber auch 3 ints übergeben: addGap(int min,int pref, int max)&lt;br /&gt;
Man kann also Minimum, Preferred und Maximum Size einstellen. Das funktioniert genauso bei Komponenten:&lt;br /&gt;
&lt;br /&gt;
Ändern wir den Code auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
. addComponent(textField1,20,20,20)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird unser Textfield1 immer genau 20 Pixel hoch sein.&lt;br /&gt;
Achtung: Die Größenangaben beziehen sich immer auf die Achse, in der sie gemacht werden. Angaben in der VerticalGroup beeinflussen nur die Höhe, Angaben in der HorizontalGroup nur die Breite.&lt;br /&gt;
&lt;br /&gt;
Die Größenangaben manuell anzugeben ist allerdings kein sauberer Stil. Komponenten haben ja selber schon min, preferred und max Size Einstellungen, die werden dadurch einfach ignoriert. Um dem GroupLayout zu sagen, es soll immer auf eine dieser Methoden zurückgreifen gibt’s 2 Konstanten:&lt;br /&gt;
GroupLayout.DEFAULT_SIZE und GroupLayout.PREFERRED_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addComponent(button1)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Textfeld maximal die Höhe seiner PreferredSize haben.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir wollen links unten in unserem Fenster einen OK Button einfügen.&lt;br /&gt;
&lt;br /&gt;
Wir fügen einen Gap zwischen Zeile 3 und dem Ok Button ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGap(0,0,Short.MAX_VALUE);&lt;br /&gt;
verticalGroup.addComponent(okButton);&lt;br /&gt;
 &lt;br /&gt;
horizontalGroup.addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addGap(0,0,Short.MAX_VALUE)&lt;br /&gt;
                .addComponent(okButton));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein (0,0,Short.MAX_VALUE) Gap füllt soviel Platz aus, wie ihm zur Verfügung steht. Egal wie groß ihr das Fenster macht, der OK Button ist immer rechts unten.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Fortgeschrittenes: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel: Wir stellen die Font eines unserer Labels auf 80 und wollen, dass die Textfeld und Button in der Mitte der Zeile angezeigt werden. Wir setzten für unsere Textfelder unterschiedliche Preferred Sizes und wollen dass die Buttons alle schön untereinander stehen und gleich breit sein. Ausserdem soll das Layout nur so viel Platz wie nötig ausfüllen.&lt;br /&gt;
&lt;br /&gt;
Erstmal setzten wir ganz normal die Preferred Size der Textfelder und die Font des Labels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;Font f = new Font( &amp;quot;Arial&amp;quot;, Font.PLAIN, 80 );&lt;br /&gt;
label1.setFont(f);&lt;br /&gt;
 &lt;br /&gt;
textField1.setPreferredSize(new Dimension(70,20));&lt;br /&gt;
textField2.setPreferredSize(new Dimension(100,20));&lt;br /&gt;
textField3.setPreferredSize(new Dimension(130,20));&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1:&#039;&#039;&#039; Die Komponenten einer Zeile der Höhe nach mittig ausrichten:&lt;br /&gt;
ParallelGroups kann man beim erzeugen einen Alignment Parameter übergeben. (Alignment. LEADING, TRAILING, CENTER oder BASELINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;verticalGroup.addGroup(layout.createParallelGroup(Alignment.CENTER)&lt;br /&gt;
.addComponent(label1)&lt;br /&gt;
.addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
.addComponent(button1)&lt;br /&gt;
);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2:&#039;&#039;&#039; Quasi ein Tabstopp für die Buttons. Wir haben nicht mehr einfach 4 Zeilen, wir haben 4 Zeilen und 2 Spalten. &lt;br /&gt;
&lt;br /&gt;
Die HorizontalGroup muss deshalb verändert werden:&lt;br /&gt;
Wir stellen uns vor, wir schauen von „Westen“/Links auf unser Layout.&lt;br /&gt;
Da wir in unserem Layout 2 Spalten haben (Rote Rechtecke), die klar abgegrenzt hintereinander kommen sollen Brauchen wir erstmal eine SequentialGroup.&lt;br /&gt;
SequentialGroup horizontalGroup=layout.createSequentialGroup();&lt;br /&gt;
&lt;br /&gt;
Jetzt betrachten wir erstmal nur das linke Rechteck (um das rechte kümmern wir uns nachher).&lt;br /&gt;
3 Zeilen übereinander mit je Label und Textfeld hintereinander oder 3 Labels übereinander, danach 3 Textfelder übereinander. (Wir machens auf die Zeilen Art).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup labelTextfieldGroup=layout.createParallelGroup()&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label1)&lt;br /&gt;
                .addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label2)&lt;br /&gt;
                .addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                )&lt;br /&gt;
                .addGroup(layout.createSequentialGroup()&lt;br /&gt;
                .addComponent(label3)&lt;br /&gt;
                .addComponent(textField3,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                );&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die 4 Buttons übereinander, das ist wieder einfacher:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;ParallelGroup buttonGroup=layout.createParallelGroup(Alignment.TRAILING)&lt;br /&gt;
        .addComponent(button1)&lt;br /&gt;
        .addComponent(button2)&lt;br /&gt;
        .addComponent(button3)&lt;br /&gt;
        .addComponent(okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt stöpseln wir die zwei roten Rechteck-Gruppen zusammen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;horizontalGroup.addGroup(labelTextfieldGroup).addGroup(buttonGroup);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3:&#039;&#039;&#039; Den Buttons die gleiche Breite verpassen.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt’s die Funktion linkSize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;layout.linkSize(SwingConstants.HORIZONTAL,button1,button2,button3,okButton);&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SwingConstants.HORIZONTAL gibt an ob man die Breite oder die Höhe verlinken will. Danach kann man beliebig viele Komponenten hinzuschreiben (varargs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links: ==&lt;br /&gt;
&lt;br /&gt;
API-Dokumentation vom [http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html GroupLayout] &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Oracle: [http://download.oracle.com/javase/tutorial/uiswing/layout/group.html How to Use GroupLayout (The Java™ Tutorials &amp;gt; Creating a GUI With JFC/Swing &amp;gt; Laying Out Components]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer: bERt0r|bERt0r]] 04:06, 16. Dez 2011 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Swing]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5600</id>
		<title>Java-Compiler-Level und .class-Datei Versionen (major- und minor version number)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5600"/>
		<updated>2013-09-01T07:52:59Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Compiler erzeugt vom JDK versionsabhängige Datei-Formate, die der Interpreter nach bestimmten Merkmalen untersucht, bevor er die Klasse ausführt.&lt;br /&gt;
&lt;br /&gt;
Die Versionsnummern geben ihm Aufschluss darüber, ob eine Klasse mit einem kompatiblen JDK kompiliert wurde. Dazu vergleicht er u.a. die major- und die minor version number, welche neben der berühmten magic number (0xCAFEBABE) im Fileheader stehen.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend werden in einer Übersicht alle bisher veröffentlichten JDKs mit den dazu gehörenden major version und minor version numbers aufgelistet:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Eine Java-Anwendung, die mit einem aktuellen JDK kompiliert wurde, läuft nicht in einer älteren JRE.&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler-Level ==&lt;br /&gt;
&lt;br /&gt;
In den meisten Fällen genügt es bereits, den Compiler-Level auf die Zielplattform auszurichten und neu zu kompilieren.&lt;br /&gt;
Das heißt, dass mit einer Compiler-Option eingestellt werden kann, welche JRE-Version ein Programm mindestens benötigt, um ausgeführt zu werden.&lt;br /&gt;
&lt;br /&gt;
Bsp: Eine Java-Anwendung wurde mit dem JDK 7 geschrieben. Beim Ausführen wird beim Anwender ein UnsupportedClassVersionError in der Java-Konsole ausgegeben. &lt;br /&gt;
Der Programmierer hat in seinem Programm nur Klassen aus den JDKs bis Version 6 verwendet. Dann kann er recht einfach die Anzahl der erreichbaren Ziel-VMs vergrößern, indem er den Compiler-Level auf Java 6 einstellt und neu kompiliert. &lt;br /&gt;
Die großen IDEs wie Eclipse und Netbeans bieten dazu Optionen in den Einstellungen an. Für Java-Editoren muss meist die Option an den Compiler-Aufruf angehängt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;javac -source 1.6 -target 1.6 MeineKlasse.java&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Anweisung akzeptiert der Compiler nur Klassen, die bis zum JDK 6 eingeführt wurden und erzeugt Bytecode für JREs ab Version 6.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:L-ectron-X|L-ectron-X]] 09:50, 01. Sept 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5599</id>
		<title>Java-Compiler-Level und .class-Datei Versionen (major- und minor version number)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5599"/>
		<updated>2013-09-01T07:52:12Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Compiler erzeugt vom JDK versionsabhängige Datei-Formate, die der Interpreter nach bestimmten Merkmalen untersucht, bevor er die Klasse ausführt.&lt;br /&gt;
&lt;br /&gt;
Die Versionsnummern geben ihm Aufschluss darüber, ob eine Klasse mit einem kompatiblen JDK kompiliert wurde. Dazu vergleicht er u.a. die major- und die minor version number, welche neben der berühmten magic number (0xCAFEBABE) im Fileheader stehen.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend werden in einer Übersicht alle bisher veröffentlichten JDKs mit den dazu gehörenden major version und minor version numbers aufgelistet:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Eine Java-Anwendung, die mit einem aktuellen JDK kompiliert wurde, läuft nicht in einer älteren JRE.&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler-Level ==&lt;br /&gt;
&lt;br /&gt;
In den meisten Fällen genügt es bereits, den Compiler-Level auf die Zielplattform auszurichten und neu zu kompilieren.&lt;br /&gt;
Das heißt, dass mit einer Compiler-Option eingestellt werden kann, welche JRE-Version ein Programm mindestens benötigt, um ausgeführt zu werden.&lt;br /&gt;
&lt;br /&gt;
Bsp: Eine Java-Anwendung wurde mit dem JDK 7 geschrieben. Beim Ausführen wird beim Anwender ein UnsupportedClassVersionError in der Java-Konsole ausgegeben. &lt;br /&gt;
Der Programmierer hat in seinem Programm nur Klassen aus den JDKs bis Version 6 verwendet. Dann kann er recht einfach die Anzahl der erreichbaren Ziel-VMs vergrößern, indem er den Compiler-Level auf Java 6 einstellt und neu kompiliert. &lt;br /&gt;
Die großen IDEs wie Eclipse und Netbeans bieten dazu Optionen in den Einstellungen an. Für Java-Editoren muss meist die Option an den Compiler-Aufruf angehängt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;javac -source 1.6 -target 1.6 MeineKlasse.java&amp;lt;\code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Anweisung akzeptiert der Compiler nur Klassen, die bis zum JDK 6 eingeführt wurden und erzeugt Bytecode für JREs ab Version 6.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:L-ectron-X|L-ectron-X]] 09:50, 01. Sept 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5598</id>
		<title>Java-Compiler-Level und .class-Datei Versionen (major- und minor version number)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5598"/>
		<updated>2013-09-01T07:51:35Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Compiler erzeugt vom JDK versionsabhängige Datei-Formate, die der Interpreter nach bestimmten Merkmalen untersucht, bevor er die Klasse ausführt.&lt;br /&gt;
&lt;br /&gt;
Die Versionsnummern geben ihm Aufschluss darüber, ob eine Klasse mit einem kompatiblen JDK kompiliert wurde. Dazu vergleicht er u.a. die major- und die minor version number, welche neben der berühmten magic number (0xCAFEBABE) im Fileheader stehen.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend werden in einer Übersicht alle bisher veröffentlichten JDKs mit den dazu gehörenden major version und minor version numbers aufgelistet:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Eine Java-Anwendung, die mit einem aktuellen JDK kompiliert wurde, läuft nicht in einer älteren JRE.&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler-Level ==&lt;br /&gt;
&lt;br /&gt;
In den meisten Fällen genügt es bereits, den Compiler-Level auf die Zielplattform auszurichten und neu zu kompilieren.&lt;br /&gt;
Das heißt, dass mit einer Compiler-Option eingestellt werden kann, welche JRE-Version ein Programm mindestens benötigt, um ausgeführt zu werden.&lt;br /&gt;
&lt;br /&gt;
Bsp: Eine Java-Anwendung wurde mit dem JDK 7 geschrieben. Beim Ausführen wird beim Anwender ein UnsupportedClassVersionError in der Java-Konsole ausgegeben. &lt;br /&gt;
Der Programmierer hat in seinem Programm nur Klassen aus den JDKs bis Version 6 verwendet. Dann kann er recht einfach die Anzahl der erreichbaren Ziel-VMs vergrößern, indem er den Compiler-Level auf Java 6 einstellt und neu kompiliert. &lt;br /&gt;
Die großen IDEs wie Eclipse und Netbeans bieten dazu Optionen in den Einstellungen an. Für Java-Editoren muss meist die Option an den Compiler-Aufruf angehängt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;javac -source 1.6 -target 1.6 MeineKlasse.java&amp;lt;code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Anweisung akzeptiert der Compiler nur Klassen, die bis zum JDK 6 eingeführt wurden und erzeugt Bytecode für JREs ab Version 6.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:L-ectron-X|L-ectron-X]] 09:50, 01. Sept 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5597</id>
		<title>Java-Compiler-Level und .class-Datei Versionen (major- und minor version number)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5597"/>
		<updated>2013-09-01T07:51:14Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Compiler erzeugt vom JDK versionsabhängige Datei-Formate, die der Interpreter nach bestimmten Merkmalen untersucht, bevor er die Klasse ausführt.&lt;br /&gt;
&lt;br /&gt;
Die Versionsnummern geben ihm Aufschluss darüber, ob eine Klasse mit einem kompatiblen JDK kompiliert wurde. Dazu vergleicht er u.a. die major- und die minor version number, welche neben der berühmten magic number (0xCAFEBABE) im Fileheader stehen.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend werden in einer Übersicht alle bisher veröffentlichten JDKs mit den dazu gehörenden major version und minor version numbers aufgelistet:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Eine Java-Anwendung, die mit einem aktuellen JDK kompiliert wurde, läuft nicht in einer älteren JRE.&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler-Level ==&lt;br /&gt;
&lt;br /&gt;
In den meisten Fällen genügt es bereits, den Compiler-Level auf die Zielplattform auszurichten und neu zu kompilieren.&lt;br /&gt;
Das heißt, dass mit einer Compiler-Option eingestellt werden kann, welche JRE-Version ein Programm mindestens benötigt, um ausgeführt zu werden.&lt;br /&gt;
&lt;br /&gt;
Bsp: Eine Java-Anwendung wurde mit dem JDK 7 geschrieben. Beim Ausführen wird beim Anwender ein UnsupportedClassVersionError in der Java-Konsole ausgegeben. &lt;br /&gt;
Der Programmierer hat in seinem Programm nur Klassen aus den JDKs bis Version 6 verwendet. Dann kann er recht einfach die Anzahl der erreichbaren Ziel-VMs vergrößern, indem er den Compiler-Level auf Java 6 einstellt und neu kompiliert. &lt;br /&gt;
Die großen IDEs wie Eclipse und Netbeans bieten dazu Optionen in den Einstellungen an. Für Java-Editoren muss meist die Option an den Compiler-Aufruf angehängt werden.&lt;br /&gt;
&lt;br /&gt;
javac -source 1.6 -target 1.6 MeineKlasse.java&lt;br /&gt;
&lt;br /&gt;
Mit dieser Anweisung akzeptiert der Compiler nur Klassen, die bis zum JDK 6 eingeführt wurden und erzeugt Bytecode für JREs ab Version 6.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:L-ectron-X|L-ectron-X]] 09:50, 01. Sept 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5596</id>
		<title>Java-Compiler-Level und .class-Datei Versionen (major- und minor version number)</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Java-Compiler-Level_und_.class-Datei_Versionen_(major-_und_minor_version_number)&amp;diff=5596"/>
		<updated>2013-09-01T07:50:00Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde neu angelegt: „Der Compiler erzeugt vom JDK versionsabhängige Datei-Formate, die der Interpreter nach bestimmten Merkmalen untersucht, bevor er die Klasse ausführt.  Die Versi…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Compiler erzeugt vom JDK versionsabhängige Datei-Formate, die der Interpreter nach bestimmten Merkmalen untersucht, bevor er die Klasse ausführt.&lt;br /&gt;
&lt;br /&gt;
Die Versionsnummern geben ihm Aufschluss darüber, ob eine Klasse mit einem kompatiblen JDK kompiliert wurde. Dazu vergleicht er u.a. die major- und die minor version number, welche neben der berühmten magic number (0xCAFEBABE) im Fileheader stehen.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend werden in einer Übersicht alle bisher veröffentlichten JDKs mit den dazu gehörenden major version und minor version numbers aufgelistet:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Eine Java-Anwendung, die mit einem aktuellen JDK kompiliert wurde, läuft nicht in einer älteren JRE.&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler-Level ==&lt;br /&gt;
&lt;br /&gt;
In den meisten Fällen genügt es bereits, den Compiler-Level auf die Zielplattform auszurichten und neu zu kompilieren.&lt;br /&gt;
Das heißt, dass mit einer Compiler-Option eingestellt werden kann, welche JRE-Version ein Programm mindestens benötigt, um ausgeführt zu werden.&lt;br /&gt;
&lt;br /&gt;
Bsp: Eine Java-Anwendung wurde mit dem JDK 7 geschrieben. Beim Ausführen wird beim Anwender ein UnsupportedClassVersionError in der Java-Konsole ausgegeben. &lt;br /&gt;
Der Programmierer hat in seinem Programm nur Klassen aus den JDKs bis Version 6 verwendet. Dann kann er recht einfach die Anzahl der erreichbaren Ziel-VMs vergrößern, indem er den Compiler-Level auf Java 6 einstellt und neu kompiliert. &lt;br /&gt;
Die großen IDEs wie Eclipse und Netbeans bieten dazu Optionen in den Einstellungen an. Für Java-Editoren muss meist die Option an den Compiler-Aufruf angehängt werden.&lt;br /&gt;
&lt;br /&gt;
javac -source 1.6 -target 1.6 MeineKlasse.java&lt;br /&gt;
&lt;br /&gt;
Mit dieser Anweisung akzeptiert der Compiler nur Klassen, die bis zum JDK 6 eingeführt wurden und erzeugt Bytecode für JREs ab Version 6.&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Warum_man_nicht_von_JFrame/JDialog_erben_sollte&amp;diff=5562</id>
		<title>Warum man nicht von JFrame/JDialog erben sollte</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Warum_man_nicht_von_JFrame/JDialog_erben_sollte&amp;diff=5562"/>
		<updated>2013-08-29T14:08:20Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Warum man nicht von JFrame/JDialog erben sollte ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag wurde von &#039;&#039;&#039;Firephoenix&#039;&#039;&#039; erstellt&lt;br /&gt;
&lt;br /&gt;
Es ist doch verwunderlich wie oft man so etwas hier sieht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui extends JFrame{&lt;br /&gt;
 &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        super(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
        getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        pack();&lt;br /&gt;
        setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieht irgendwie bekannt aus, oder?&lt;br /&gt;
Und: Normalerweise würgt man die VM auch nicht mit &amp;lt;code=java&amp;gt;System.exit(0);&amp;lt;/code=java&amp;gt; respektive &amp;lt;code=java&amp;gt;frame.setDefaultCloseOperation(EXIT_ON_CLOSE);&amp;lt;/code=java&amp;gt; ab, sondern ruft &amp;lt;code=java&amp;gt;dispose()&amp;lt;/code=java&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich ist der Code genauso furchtbar wie das hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal extends ArrayList&amp;lt;String&amp;gt;{&lt;br /&gt;
 &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und mal ehrlich, wer würde auf die Idee kommen, so etwas anzustellen?&lt;br /&gt;
&lt;br /&gt;
Da schreibt man ein Buchregal, das 3 Buchtitel enthält, doch lieber so oder?&lt;br /&gt;
(zugegeben es ist kein schönes Buchregal das nur die Titel kennt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal{&lt;br /&gt;
 &lt;br /&gt;
    private ArrayList&amp;lt;String&amp;gt; buchtitel;&lt;br /&gt;
    &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        buchtitel = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        buchtitel.add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und genau so kann man auch mit der GUI-Klasse verfahren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui{&lt;br /&gt;
 &lt;br /&gt;
    private JFrame frame;&lt;br /&gt;
    &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        frame = new JFrame(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);&lt;br /&gt;
        frame.getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        frame.pack();&lt;br /&gt;
        frame.setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur was hat man jetzt eigentlich gemacht?&lt;br /&gt;
&lt;br /&gt;
In den ersten 2 Beispielen haben wir Vererbung benutzt, um eine Klasse zu verwenden.&lt;br /&gt;
Das Stichwort hier ist &amp;quot;verwenden&amp;quot; und nicht &amp;quot;erweitern&amp;quot;!&lt;br /&gt;
Wir haben lediglich bestehende Funktionen der Klasse JFrame verwendet, aber keine neue Funktionalität hinzugefügt.&lt;br /&gt;
Solange wir das nicht machen, besteht kein Grund von einer Klasse zu erben!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verwenden != Erweitern&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote L-ectron-X&amp;gt;&lt;br /&gt;
Wenn wir von einer Klasse erben, sprechen wir auch davon, sie zu spezialisieren.&lt;br /&gt;
Genauso, wie der Vater persönliche Eigenschaften an den Sohn vererbt, bekommt in der OOP eine erbende Klasse die Eigenschaften (Methoden und öffentliche Instanzvariablen) der Basisklasse (auch Superklasse) eingepflanzt. Die erbende Klasse muss aber für eine sinnvolle Anwendung der Vererbung weitere Eigenschaften erhalten, und/oder bestehende Eigenschaften spezialisieren.&lt;br /&gt;
Genauso wie der Sohn vom Vater die Fähigkeit erbte, besonders schnell die 60m zu laufen, kann der Sohn nun aber auch noch die 100m besonders schnell laufen. Eine Fähigkeit, zu der der Vater nicht im Stande ist.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie es im Englischen schön heißt: composition over inheritance.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen daher möglichst Felder anstatt Vererbung.&lt;br /&gt;
&lt;br /&gt;
Felder können jederzeit ausgetauscht werden, unser Bücherregal könnte zur Programmlaufzeit die ArrayList durch eine LinkedList ersetzen, (oder wenn der typ des Feldes nur Collection &amp;lt;String&amp;gt; wäre), sogar auf ein HashSet umsteigen.&lt;br /&gt;
Benutzen wir dagegen Vererbung sind wir für alle Ewigkeit an die ArrayList gebunden und können zur Laufzeit nicht mehr davon weg.&lt;br /&gt;
Außerdem wird die Vererbung Teil der API unserer Software, ein anderer Programmierer wird unsere Komponente z.B. auch wie eine ArrayList verwenden, auch hier haben wir keine Möglichkeit etwas zu Ändern ohne anderen Code zu gefährden.&lt;br /&gt;
Halten wir dagegen solche Implementierungsdetails in privaten Feldern versteckt können wir zu jeder Zeit daran herumspielen, ohne das jemand etwas davon mitbekommen wird.&lt;br /&gt;
&lt;br /&gt;
Ein Fall wo es tatsächlich Sinn macht von einer Grafikkomponente zu erben wäre dieser hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class PaintingPanel extends JPanel{&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void paintComponent(Graphics g){&lt;br /&gt;
        super.paintComponent(g);&lt;br /&gt;
        g.drawLine(3, 3, 6, 6);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} &amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier haben wir das JPanel tatsächlich erweitert, nämlich um eine hässliche kleine Linie die darauf gezeichnet wird &lt;br /&gt;
&lt;br /&gt;
Zu bemerken ist hier das @Override und der super-Aufruf.&lt;br /&gt;
Es ist kein guter Stil, Methoden komplett zu überschreiben (z.B. würde das hier zu Zeichenfehlern im eigentlichen Panel führen), daher rufen wir zuerst die Methode der Superklasse auf.&lt;br /&gt;
Weiterhin zeigt uns das @Override an, dass wir eine Methode der Superklasse überschrieben haben (und der Compiler meckert uns an wenn, wir sie falsch geschrieben haben -&amp;gt; gängige Fehlerquelle vermieden).&lt;br /&gt;
&lt;br /&gt;
Generell also: &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine Klasse verwenden wollen, legen wir ein Feld mit dem Typ der Klasse an und verwenden das Feld.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine bestehende Klasse um neue Funktionalität erweitern wollen, dann erben wir von der Klasse.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
composition over inheritance&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Firephoenix|Firephoenix]] 19:18, 28. Aug 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Swing]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Warum_man_nicht_von_JFrame/JDialog_erben_sollte&amp;diff=5560</id>
		<title>Warum man nicht von JFrame/JDialog erben sollte</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Warum_man_nicht_von_JFrame/JDialog_erben_sollte&amp;diff=5560"/>
		<updated>2013-08-28T17:19:49Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Warum man nicht von JFrame/JDialog erben sollte ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag wurde von &#039;&#039;&#039;Firephoenix&#039;&#039;&#039; erstellt&lt;br /&gt;
&lt;br /&gt;
Es ist doch verwunderlich wie oft man so etwas hier sieht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui extends JFrame{&lt;br /&gt;
 &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        super(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
        getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        pack();&lt;br /&gt;
        setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieht irgendwie bekannt aus, oder?&lt;br /&gt;
Und: Normalerweise würgt man die VM auch nicht mit &amp;lt;code=java&amp;gt;System.exit(0);&amp;lt;/code=java&amp;gt; respektive &amp;lt;code=java&amp;gt;frame.setDefaultCloseOperation(EXIT_ON_CLOSE);&amp;lt;/code=java&amp;gt; ab, sondern ruft &amp;lt;code=java&amp;gt;dispose()&amp;lt;/code=java&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich ist der Code genauso furchtbar wie das hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal extends ArrayList&amp;lt;String&amp;gt;{&lt;br /&gt;
 &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und mal ehrlich, wer würde auf die Idee kommen, so etwas anzustellen?&lt;br /&gt;
&lt;br /&gt;
Da schreibt man ein Buchregal, das 3 Buchtitel enthält, doch lieber so oder?&lt;br /&gt;
(zugegeben es ist kein schönes Buchregal das nur die Titel kennt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal{&lt;br /&gt;
 &lt;br /&gt;
    private ArrayList&amp;lt;String&amp;gt; buchtitel;&lt;br /&gt;
    &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        buchtitel = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        buchtitel.add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und genau so kann man auch mit der GUI-Klasse verfahren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui{&lt;br /&gt;
 &lt;br /&gt;
    private JFrame frame;&lt;br /&gt;
    &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        frame = new JFrame(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);&lt;br /&gt;
        frame.getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        frame.pack();&lt;br /&gt;
        frame.setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur was hat man jetzt eigentlich gemacht?&lt;br /&gt;
&lt;br /&gt;
In den ersten 2 Beispielen haben wir Vererbung benutzt, um eine Klasse zu verwenden.&lt;br /&gt;
Das Stichwort hier ist &amp;quot;verwenden&amp;quot; und nicht &amp;quot;erweitern&amp;quot;!&lt;br /&gt;
Wir haben lediglich bestehende Funktionen der Klasse JFrame verwendet, aber keine neue Funktionalität hinzugefügt.&lt;br /&gt;
Solange wir das nicht machen, besteht kein Grund von einer Klasse zu erben!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verwenden != Erweitern&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Zitat &lt;br /&gt;
| Autor = L-ectron-X&lt;br /&gt;
| Text  = Wenn wir von einer Klasse erben, sprechen wir auch davon, sie zu spezialisieren.&lt;br /&gt;
Genauso, wie der Vater persönliche Eigenschaften an den Sohn vererbt, bekommt in der OOP eine erbende Klasse die Eigenschaften (Methoden und öffentliche Instanzvariablen) der Basisklasse (auch Superklasse) eingepflanzt. Die erbende Klasse muss aber für eine sinnvolle Anwendung der Vererbung weitere Eigenschaften erhalten, und/oder bestehende Eigenschaften spezialisieren.&lt;br /&gt;
Genauso wie der Sohn vom Vater die Fähigkeit erbte, besonders schnell die 60m zu laufen, kann der Sohn nun aber auch noch die 100m besonders schnell laufen. Eine Fähigkeit, zu der der Vater nicht im Stande ist.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Wie es im Englischen schön heißt: composition over inheritance.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen daher möglichst Felder anstatt Vererbung.&lt;br /&gt;
&lt;br /&gt;
Felder können jederzeit ausgetauscht werden, unser Bücherregal könnte zur Programmlaufzeit die ArrayList durch eine LinkedList ersetzen, (oder wenn der typ des Feldes nur Collection &amp;lt;String&amp;gt; wäre), sogar auf ein HashSet umsteigen.&lt;br /&gt;
Benutzen wir dagegen Vererbung sind wir für alle Ewigkeit an die ArrayList gebunden und können zur Laufzeit nicht mehr davon weg.&lt;br /&gt;
Außerdem wird die Vererbung Teil der API unserer Software, ein anderer Programmierer wird unsere Komponente z.B. auch wie eine ArrayList verwenden, auch hier haben wir keine Möglichkeit etwas zu Ändern ohne anderen Code zu gefährden.&lt;br /&gt;
Halten wir dagegen solche Implementierungsdetails in privaten Feldern versteckt können wir zu jeder Zeit daran herumspielen, ohne das jemand etwas davon mitbekommen wird.&lt;br /&gt;
&lt;br /&gt;
Ein Fall wo es tatsächlich Sinn macht von einer Grafikkomponente zu erben wäre dieser hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class PaintingPanel extends JPanel{&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void paintComponent(Graphics g){&lt;br /&gt;
        super.paintComponent(g);&lt;br /&gt;
        g.drawLine(3, 3, 6, 6);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} &amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier haben wir das JPanel tatsächlich erweitert, nämlich um eine hässliche kleine Linie die darauf gezeichnet wird &lt;br /&gt;
&lt;br /&gt;
Zu bemerken ist hier das @Override und der super-Aufruf.&lt;br /&gt;
Es ist kein guter Stil, Methoden komplett zu überschreiben (z.B. würde das hier zu Zeichenfehlern im eigentlichen Panel führen), daher rufen wir zuerst die Methode der Superklasse auf.&lt;br /&gt;
Weiterhin zeigt uns das @Override an, dass wir eine Methode der Superklasse überschrieben haben (und der Compiler meckert uns an wenn, wir sie falsch geschrieben haben -&amp;gt; gängige Fehlerquelle vermieden).&lt;br /&gt;
&lt;br /&gt;
Generell also: &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine Klasse verwenden wollen, legen wir ein Feld mit dem Typ der Klasse an und verwenden das Feld.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine bestehende Klasse um neue Funktionalität erweitern wollen, dann erben wir von der Klasse.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
composition over inheritance&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Firephoenix|Firephoenix]] 19:18, 28. Aug 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java Swing]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Warum_man_nicht_von_JFrame/JDialog_erben_sollte&amp;diff=5559</id>
		<title>Warum man nicht von JFrame/JDialog erben sollte</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Warum_man_nicht_von_JFrame/JDialog_erben_sollte&amp;diff=5559"/>
		<updated>2013-08-28T17:18:48Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Warum man nicht von JFrame/JDialog erben sollte ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag wurde von &#039;&#039;&#039;Firephoenix&#039;&#039;&#039; erstellt&lt;br /&gt;
&lt;br /&gt;
Es ist doch verwunderlich wie oft man so etwas hier sieht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui extends JFrame{&lt;br /&gt;
 &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        super(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
        getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        pack();&lt;br /&gt;
        setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieht irgendwie bekannt aus, oder?&lt;br /&gt;
Und: Normalerweise würgt man die VM auch nicht mit &amp;lt;code=java&amp;gt;System.exit(0);&amp;lt;/code=java&amp;gt; respektive &amp;lt;code=java&amp;gt;frame.setDefaultCloseOperation(EXIT_ON_CLOSE);&amp;lt;/code=java&amp;gt; ab, sondern ruft &amp;lt;code=java&amp;gt;dispose()&amp;lt;/code=java&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich ist der Code genauso furchtbar wie das hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal extends ArrayList&amp;lt;String&amp;gt;{&lt;br /&gt;
 &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und mal ehrlich, wer würde auf die Idee kommen, so etwas anzustellen?&lt;br /&gt;
&lt;br /&gt;
Da schreibt man ein Buchregal, das 3 Buchtitel enthält, doch lieber so oder?&lt;br /&gt;
(zugegeben es ist kein schönes Buchregal das nur die Titel kennt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal{&lt;br /&gt;
 &lt;br /&gt;
    private ArrayList&amp;lt;String&amp;gt; buchtitel;&lt;br /&gt;
    &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        buchtitel = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        buchtitel.add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und genau so kann man auch mit der GUI-Klasse verfahren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui{&lt;br /&gt;
 &lt;br /&gt;
    private JFrame frame;&lt;br /&gt;
    &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        frame = new JFrame(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);&lt;br /&gt;
        frame.getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        frame.pack();&lt;br /&gt;
        frame.setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur was hat man jetzt eigentlich gemacht?&lt;br /&gt;
&lt;br /&gt;
In den ersten 2 Beispielen haben wir Vererbung benutzt, um eine Klasse zu verwenden.&lt;br /&gt;
Das Stichwort hier ist &amp;quot;verwenden&amp;quot; und nicht &amp;quot;erweitern&amp;quot;!&lt;br /&gt;
Wir haben lediglich bestehende Funktionen der Klasse JFrame verwendet, aber keine neue Funktionalität hinzugefügt.&lt;br /&gt;
Solange wir das nicht machen, besteht kein Grund von einer Klasse zu erben!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verwenden != Erweitern&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Zitat &lt;br /&gt;
| Autor = L-ectron-X&lt;br /&gt;
| Text  = Wenn wir von einer Klasse erben, sprechen wir auch davon, sie zu spezialisieren.&lt;br /&gt;
Genauso, wie der Vater persönliche Eigenschaften an den Sohn vererbt, bekommt in der OOP eine erbende Klasse die Eigenschaften (Methoden und öffentliche Instanzvariablen) der Basisklasse (auch Superklasse) eingepflanzt. Die erbende Klasse muss aber für eine sinnvolle Anwendung der Vererbung weitere Eigenschaften erhalten, und/oder bestehende Eigenschaften spezialisieren.&lt;br /&gt;
Genauso wie der Sohn vom Vater die Fähigkeit erbte, besonders schnell die 60m zu laufen, kann der Sohn nun aber auch noch die 100m besonders schnell laufen. Eine Fähigkeit, zu der der Vater nicht im Stande ist.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Wie es im Englischen schön heißt: composition over inheritance.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen daher möglichst Felder anstatt Vererbung.&lt;br /&gt;
&lt;br /&gt;
Felder können jederzeit ausgetauscht werden, unser Bücherregal könnte zur Programmlaufzeit die ArrayList durch eine LinkedList ersetzen, (oder wenn der typ des Feldes nur Collection &amp;lt;String&amp;gt; wäre), sogar auf ein HashSet umsteigen.&lt;br /&gt;
Benutzen wir dagegen Vererbung sind wir für alle Ewigkeit an die ArrayList gebunden und können zur Laufzeit nicht mehr davon weg.&lt;br /&gt;
Außerdem wird die Vererbung Teil der API unserer Software, ein anderer Programmierer wird unsere Komponente z.B. auch wie eine ArrayList verwenden, auch hier haben wir keine Möglichkeit etwas zu Ändern ohne anderen Code zu gefährden.&lt;br /&gt;
Halten wir dagegen solche Implementierungsdetails in privaten Feldern versteckt können wir zu jeder Zeit daran herumspielen, ohne das jemand etwas davon mitbekommen wird.&lt;br /&gt;
&lt;br /&gt;
Ein Fall wo es tatsächlich Sinn macht von einer Grafikkomponente zu erben wäre dieser hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class PaintingPanel extends JPanel{&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void paintComponent(Graphics g){&lt;br /&gt;
        super.paintComponent(g);&lt;br /&gt;
        g.drawLine(3, 3, 6, 6);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} &amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier haben wir das JPanel tatsächlich erweitert, nämlich um eine hässliche kleine Linie die darauf gezeichnet wird &lt;br /&gt;
&lt;br /&gt;
Zu bemerken ist hier das @Override und der super-Aufruf.&lt;br /&gt;
Es ist kein guter Stil, Methoden komplett zu überschreiben (z.B. würde das hier zu Zeichenfehlern im eigentlichen Panel führen), daher rufen wir zuerst die Methode der Superklasse auf.&lt;br /&gt;
Weiterhin zeigt uns das @Override an, dass wir eine Methode der Superklasse überschrieben haben (und der Compiler meckert uns an wenn, wir sie falsch geschrieben haben -&amp;gt; gängige Fehlerquelle vermieden).&lt;br /&gt;
&lt;br /&gt;
Generell also: &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine Klasse verwenden wollen, legen wir ein Feld mit dem Typ der Klasse an und verwenden das Feld.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine bestehende Klasse um neue Funktionalität erweitern wollen, dann erben wir von der Klasse.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
composition over inheritance&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Firephoenix|Firephoenix]] 19:18, 28. Aug 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Warum_man_nicht_von_JFrame/JDialog_erben_sollte&amp;diff=5558</id>
		<title>Warum man nicht von JFrame/JDialog erben sollte</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Warum_man_nicht_von_JFrame/JDialog_erben_sollte&amp;diff=5558"/>
		<updated>2013-08-28T17:16:48Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde neu angelegt: „== Warum man nicht von JFrame/JDialog erben sollte ==   Dieser Beitrag wurde von &amp;#039;&amp;#039;&amp;#039;Firephoenix&amp;#039;&amp;#039;&amp;#039; erstellt  Es ist doch verwunderlich wie oft man so etwas hier s…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Warum man nicht von JFrame/JDialog erben sollte ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag wurde von &#039;&#039;&#039;Firephoenix&#039;&#039;&#039; erstellt&lt;br /&gt;
&lt;br /&gt;
Es ist doch verwunderlich wie oft man so etwas hier sieht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui extends JFrame{&lt;br /&gt;
 &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        super(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
        getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        pack();&lt;br /&gt;
        setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieht irgendwie bekannt aus, oder?&lt;br /&gt;
Und: Normalerweise würgt man die VM auch nicht mit &amp;lt;code=java&amp;gt;System.exit(0);&amp;lt;/code=java&amp;gt; respektive &amp;lt;code=java&amp;gt;frame.setDefaultCloseOperation(EXIT_ON_CLOSE);&amp;lt;/code=java&amp;gt; ab, sondern ruft &amp;lt;code=java&amp;gt;dispose()&amp;lt;/code=java&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich ist der Code genauso furchtbar wie das hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal extends ArrayList&amp;lt;String&amp;gt;{&lt;br /&gt;
 &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und mal ehrlich, wer würde auf die Idee kommen, so etwas anzustellen?&lt;br /&gt;
&lt;br /&gt;
Da schreibt man ein Buchregal, das 3 Buchtitel enthält, doch lieber so oder?&lt;br /&gt;
(zugegeben es ist kein schönes Buchregal das nur die Titel kennt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal{&lt;br /&gt;
 &lt;br /&gt;
    private ArrayList&amp;lt;String&amp;gt; buchtitel;&lt;br /&gt;
    &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        buchtitel = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        buchtitel.add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und genau so kann man auch mit der GUI-Klasse verfahren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui{&lt;br /&gt;
 &lt;br /&gt;
    private JFrame frame;&lt;br /&gt;
    &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        frame = new JFrame(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);&lt;br /&gt;
        frame.getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        frame.pack();&lt;br /&gt;
        frame.setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur was hat man jetzt eigentlich gemacht?&lt;br /&gt;
&lt;br /&gt;
In den ersten 2 Beispielen haben wir Vererbung benutzt, um eine Klasse zu verwenden.&lt;br /&gt;
Das Stichwort hier ist &amp;quot;verwenden&amp;quot; und nicht &amp;quot;erweitern&amp;quot;!&lt;br /&gt;
Wir haben lediglich bestehende Funktionen der Klasse JFrame verwendet, aber keine neue Funktionalität hinzugefügt.&lt;br /&gt;
Solange wir das nicht machen, besteht kein Grund von einer Klasse zu erben!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verwenden != Erweitern&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Zitat &lt;br /&gt;
| Autor = L-ectron-X&lt;br /&gt;
| Text  = Wenn wir von einer Klasse erben, sprechen wir auch davon, sie zu spezialisieren.&lt;br /&gt;
Genauso, wie der Vater persönliche Eigenschaften an den Sohn vererbt, bekommt in der OOP eine erbende Klasse die Eigenschaften (Methoden und öffentliche Instanzvariablen) der Basisklasse (auch Superklasse) eingepflanzt. Die erbende Klasse muss aber für eine sinnvolle Anwendung der Vererbung weitere Eigenschaften erhalten, und/oder bestehende Eigenschaften spezialisieren.&lt;br /&gt;
Genauso wie der Sohn vom Vater die Fähigkeit erbte, besonders schnell die 60m zu laufen, kann der Sohn nun aber auch noch die 100m besonders schnell laufen. Eine Fähigkeit, zu der der Vater nicht im Stande ist.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Wie es im Englischen schön heißt: composition over inheritance.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen daher möglichst Felder anstatt Vererbung.&lt;br /&gt;
&lt;br /&gt;
Felder können jederzeit ausgetauscht werden, unser Bücherregal könnte zur Programmlaufzeit die ArrayList durch eine LinkedList ersetzen, (oder wenn der typ des Feldes nur Collection &amp;lt;String&amp;gt; wäre), sogar auf ein HashSet umsteigen.&lt;br /&gt;
Benutzen wir dagegen Vererbung sind wir für alle Ewigkeit an die ArrayList gebunden und können zur Laufzeit nicht mehr davon weg.&lt;br /&gt;
Außerdem wird die Vererbung Teil der API unserer Software, ein anderer Programmierer wird unsere Komponente z.B. auch wie eine ArrayList verwenden, auch hier haben wir keine Möglichkeit etwas zu Ändern ohne anderen Code zu gefährden.&lt;br /&gt;
Halten wir dagegen solche Implementierungsdetails in privaten Feldern versteckt können wir zu jeder Zeit daran herumspielen, ohne das jemand etwas davon mitbekommen wird.&lt;br /&gt;
&lt;br /&gt;
Ein Fall wo es tatsächlich Sinn macht von einer Grafikkomponente zu erben wäre dieser hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class PaintingPanel extends JPanel{&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void paintComponent(Graphics g){&lt;br /&gt;
        super.paintComponent(g);&lt;br /&gt;
        g.drawLine(3, 3, 6, 6);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} &amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier haben wir das JPanel tatsächlich erweitert, nämlich um eine hässliche kleine Linie die darauf gezeichnet wird &lt;br /&gt;
&lt;br /&gt;
Zu bemerken ist hier das @Override und der super-Aufruf.&lt;br /&gt;
Es ist kein guter Stil, Methoden komplett zu überschreiben (z.B. würde das hier zu Zeichenfehlern im eigentlichen Panel führen), daher rufen wir zuerst die Methode der Superklasse auf.&lt;br /&gt;
Weiterhin zeigt uns das @Override an, dass wir eine Methode der Superklasse überschrieben haben (und der Compiler meckert uns an wenn, wir sie falsch geschrieben haben -&amp;gt; gängige Fehlerquelle vermieden).&lt;br /&gt;
&lt;br /&gt;
Generell also: &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine Klasse verwenden wollen, legen wir ein Feld mit dem Typ der Klasse an und verwenden das Feld.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine bestehende Klasse um neue Funktionalität erweitern wollen, dann erben wir von der Klasse.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
composition over inheritance&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Benutzer:Headnut&amp;diff=5557</id>
		<title>Benutzer:Headnut</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Benutzer:Headnut&amp;diff=5557"/>
		<updated>2013-08-28T17:16:14Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde geleert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Benutzer:Headnut&amp;diff=5556</id>
		<title>Benutzer:Headnut</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Benutzer:Headnut&amp;diff=5556"/>
		<updated>2013-08-28T17:11:57Z</updated>

		<summary type="html">&lt;p&gt;Headnut: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Warum man nicht von JFrame/JDialog erben sollte ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag wurde von &#039;&#039;&#039;Firephoenix&#039;&#039;&#039; erstellt&lt;br /&gt;
&lt;br /&gt;
Es ist doch verwunderlich wie oft man so etwas hier sieht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui extends JFrame{&lt;br /&gt;
 &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        super(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
        getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        pack();&lt;br /&gt;
        setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieht irgendwie bekannt aus, oder?&lt;br /&gt;
Und: Normalerweise würgt man die VM auch nicht mit &amp;lt;code=java&amp;gt;System.exit(0);&amp;lt;/code=java&amp;gt; respektive &amp;lt;code=java&amp;gt;frame.setDefaultCloseOperation(EXIT_ON_CLOSE);&amp;lt;/code=java&amp;gt; ab, sondern ruft &amp;lt;code=java&amp;gt;dispose()&amp;lt;/code=java&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich ist der Code genauso furchtbar wie das hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal extends ArrayList&amp;lt;String&amp;gt;{&lt;br /&gt;
 &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und mal ehrlich, wer würde auf die Idee kommen, so etwas anzustellen?&lt;br /&gt;
&lt;br /&gt;
Da schreibt man ein Buchregal, das 3 Buchtitel enthält, doch lieber so oder?&lt;br /&gt;
(zugegeben es ist kein schönes Buchregal das nur die Titel kennt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal{&lt;br /&gt;
 &lt;br /&gt;
    private ArrayList&amp;lt;String&amp;gt; buchtitel;&lt;br /&gt;
    &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        buchtitel = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        buchtitel.add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und genau so kann man auch mit der GUI-Klasse verfahren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui{&lt;br /&gt;
 &lt;br /&gt;
    private JFrame frame;&lt;br /&gt;
    &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        frame = new JFrame(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);&lt;br /&gt;
        frame.getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        frame.pack();&lt;br /&gt;
        frame.setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur was hat man jetzt eigentlich gemacht?&lt;br /&gt;
&lt;br /&gt;
In den ersten 2 Beispielen haben wir Vererbung benutzt, um eine Klasse zu verwenden.&lt;br /&gt;
Das Stichwort hier ist &amp;quot;verwenden&amp;quot; und nicht &amp;quot;erweitern&amp;quot;!&lt;br /&gt;
Wir haben lediglich bestehende Funktionen der Klasse JFrame verwendet, aber keine neue Funktionalität hinzugefügt.&lt;br /&gt;
Solange wir das nicht machen, besteht kein Grund von einer Klasse zu erben!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verwenden != Erweitern&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Zitat &lt;br /&gt;
| Autor = L-ectron-X&lt;br /&gt;
| Text  = Wenn wir von einer Klasse erben, sprechen wir auch davon, sie zu spezialisieren.&lt;br /&gt;
Genauso, wie der Vater persönliche Eigenschaften an den Sohn vererbt, bekommt in der OOP eine erbende Klasse die Eigenschaften (Methoden und öffentliche Instanzvariablen) der Basisklasse (auch Superklasse) eingepflanzt. Die erbende Klasse muss aber für eine sinnvolle Anwendung der Vererbung weitere Eigenschaften erhalten, und/oder bestehende Eigenschaften spezialisieren.&lt;br /&gt;
Genauso wie der Sohn vom Vater die Fähigkeit erbte, besonders schnell die 60m zu laufen, kann der Sohn nun aber auch noch die 100m besonders schnell laufen. Eine Fähigkeit, zu der der Vater nicht im Stande ist.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Wie es im Englischen schön heißt: composition over inheritance.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen daher möglichst Felder anstatt Vererbung.&lt;br /&gt;
&lt;br /&gt;
Felder können jederzeit ausgetauscht werden, unser Bücherregal könnte zur Programmlaufzeit die ArrayList durch eine LinkedList ersetzen, (oder wenn der typ des Feldes nur Collection &amp;lt;String&amp;gt; wäre), sogar auf ein HashSet umsteigen.&lt;br /&gt;
Benutzen wir dagegen Vererbung sind wir für alle Ewigkeit an die ArrayList gebunden und können zur Laufzeit nicht mehr davon weg.&lt;br /&gt;
Außerdem wird die Vererbung Teil der API unserer Software, ein anderer Programmierer wird unsere Komponente z.B. auch wie eine ArrayList verwenden, auch hier haben wir keine Möglichkeit etwas zu Ändern ohne anderen Code zu gefährden.&lt;br /&gt;
Halten wir dagegen solche Implementierungsdetails in privaten Feldern versteckt können wir zu jeder Zeit daran herumspielen, ohne das jemand etwas davon mitbekommen wird.&lt;br /&gt;
&lt;br /&gt;
Ein Fall wo es tatsächlich Sinn macht von einer Grafikkomponente zu erben wäre dieser hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class PaintingPanel extends JPanel{&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void paintComponent(Graphics g){&lt;br /&gt;
        super.paintComponent(g);&lt;br /&gt;
        g.drawLine(3, 3, 6, 6);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} &amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier haben wir das JPanel tatsächlich erweitert, nämlich um eine hässliche kleine Linie die darauf gezeichnet wird &lt;br /&gt;
&lt;br /&gt;
Zu bemerken ist hier das @Override und der super-Aufruf.&lt;br /&gt;
Es ist kein guter Stil, Methoden komplett zu überschreiben (z.B. würde das hier zu Zeichenfehlern im eigentlichen Panel führen), daher rufen wir zuerst die Methode der Superklasse auf.&lt;br /&gt;
Weiterhin zeigt uns das @Override an, dass wir eine Methode der Superklasse überschrieben haben (und der Compiler meckert uns an wenn, wir sie falsch geschrieben haben -&amp;gt; gängige Fehlerquelle vermieden).&lt;br /&gt;
&lt;br /&gt;
Generell also: &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine Klasse verwenden wollen, legen wir ein Feld mit dem Typ der Klasse an und verwenden das Feld.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine bestehende Klasse um neue Funktionalität erweitern wollen, dann erben wir von der Klasse.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
composition over inheritance&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Benutzer:Headnut&amp;diff=5555</id>
		<title>Benutzer:Headnut</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Benutzer:Headnut&amp;diff=5555"/>
		<updated>2013-08-28T17:09:02Z</updated>

		<summary type="html">&lt;p&gt;Headnut: Die Seite wurde neu angelegt: „ == Warum man nicht von JFrame/JDialog erben sollte ==   Dieser Beitrag wurde von &amp;#039;&amp;#039;&amp;#039;Firephoenix&amp;#039;&amp;#039;&amp;#039; erstellt  Es ist doch verwunderlich wie oft man so etwas hier …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Warum man nicht von JFrame/JDialog erben sollte ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag wurde von &#039;&#039;&#039;Firephoenix&#039;&#039;&#039; erstellt&lt;br /&gt;
&lt;br /&gt;
Es ist doch verwunderlich wie oft man so etwas hier sieht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui extends JFrame{&lt;br /&gt;
 &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        super(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
        getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        pack();&lt;br /&gt;
        setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sieht irgendwie bekannt aus, oder?&lt;br /&gt;
Und: Normalerweise würgt man die VM auch nicht mit &amp;lt;code=java&amp;gt;System.exit(0);&amp;lt;/code=java&amp;gt; respektive &amp;lt;code=java&amp;gt;frame.setDefaultCloseOperation(EXIT_ON_CLOSE);&amp;lt;/code=java&amp;gt; ab, sondern ruft &amp;lt;code=java&amp;gt;dispose()&amp;lt;/code=java&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich ist der Code genauso furchtbar wie das hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal extends ArrayList&amp;lt;String&amp;gt;{&lt;br /&gt;
 &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und mal ehrlich, wer würde auf die Idee kommen, so etwas anzustellen?&lt;br /&gt;
&lt;br /&gt;
Da schreibt man ein Buchregal, das 3 Buchtitel enthält, doch lieber so oder?&lt;br /&gt;
(zugegeben es ist kein schönes Buchregal das nur die Titel kennt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Buchregal{&lt;br /&gt;
 &lt;br /&gt;
    private ArrayList&amp;lt;String&amp;gt; buchtitel;&lt;br /&gt;
    &lt;br /&gt;
    public Buchregal(){&lt;br /&gt;
        buchtitel = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        buchtitel.add(&amp;quot;Spiele programmieren mit Java&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Spring im Einsatz&amp;quot;);&lt;br /&gt;
        buchtitel.add(&amp;quot;Handbuch der Java Programmierung&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und genau so kann man auch mit der GUI-Klasse verfahren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class Gui{&lt;br /&gt;
 &lt;br /&gt;
    private JFrame frame;&lt;br /&gt;
    &lt;br /&gt;
    public Gui(){&lt;br /&gt;
        frame = new JFrame(&amp;quot;Toller titel&amp;quot;);&lt;br /&gt;
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);&lt;br /&gt;
        frame.getContentPane().add(new JButton(&amp;quot;sinnloser button&amp;quot;));&lt;br /&gt;
        frame.pack();&lt;br /&gt;
        frame.setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur was hat man jetzt eigentlich gemacht?&lt;br /&gt;
&lt;br /&gt;
In den ersten 2 Beispielen haben wir Vererbung benutzt, um eine Klasse zu verwenden.&lt;br /&gt;
Das Stichwort hier ist &amp;quot;verwenden&amp;quot; und nicht &amp;quot;erweitern&amp;quot;!&lt;br /&gt;
Wir haben lediglich bestehende Funktionen der Klasse JFrame verwendet, aber keine neue Funktionalität hinzugefügt.&lt;br /&gt;
Solange wir das nicht machen, besteht kein Grund von einer Klasse zu erben!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verwenden != Erweitern&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Zitat &lt;br /&gt;
| Autor = L-ectron-X&lt;br /&gt;
| Text  = Wenn wir von einer Klasse erben, sprechen wir auch davon, sie zu spezialisieren.&lt;br /&gt;
Genauso, wie der Vater persönliche Eigenschaften an den Sohn vererbt, bekommt in der OOP eine erbende Klasse die Eigenschaften (Methoden und öffentliche Instanzvariablen) der Basisklasse (auch Superklasse) eingepflanzt. Die erbende Klasse muss aber für eine sinnvolle Anwendung der Vererbung weitere Eigenschaften erhalten, und/oder bestehende Eigenschaften spezialisieren.&lt;br /&gt;
Genauso wie der Sohn vom Vater die Fähigkeit erbte, besonders schnell die 60m zu laufen, kann der Sohn nun aber auch noch die 100m besonders schnell laufen. Eine Fähigkeit, zu der der Vater nicht im Stande ist.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Wie es im Englischen schön heißt: composition over inheritance.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen daher möglichst Felder anstatt Vererbung.&lt;br /&gt;
&lt;br /&gt;
Felder können jederzeit ausgetauscht werden, unser Bücherregal könnte zur Programmlaufzeit die ArrayList durch eine LinkedList ersetzen, (oder wenn der typ des Feldes nur Collection &amp;lt;String&amp;gt; wäre), sogar auf ein HashSet umsteigen.&lt;br /&gt;
Benutzen wir dagegen Vererbung sind wir für alle Ewigkeit an die ArrayList gebunden und können zur Laufzeit nicht mehr davon weg.&lt;br /&gt;
Außerdem wird die Vererbung Teil der API unserer Software, ein anderer Programmierer wird unsere Komponente z.B. auch wie eine ArrayList verwenden, auch hier haben wir keine Möglichkeit etwas zu Ändern ohne anderen Code zu gefährden.&lt;br /&gt;
Halten wir dagegen solche Implementierungsdetails in privaten Feldern versteckt können wir zu jeder Zeit daran herumspielen, ohne das jemand etwas davon mitbekommen wird.&lt;br /&gt;
&lt;br /&gt;
Ein Fall wo es tatsächlich Sinn macht von einer Grafikkomponente zu erben wäre dieser hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;public class PaintingPanel extends JPanel{&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void paintComponent(Graphics g){&lt;br /&gt;
        super.paintComponent(g);&lt;br /&gt;
        g.drawLine(3, 3, 6, 6);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} &amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier haben wir das JPanel tatsächlich erweitert, nämlich um eine hässliche kleine Linie die darauf gezeichnet wird &lt;br /&gt;
&lt;br /&gt;
Zu bemerken ist hier das @Override und der super-Aufruf.&lt;br /&gt;
Es ist kein guter Stil, Methoden komplett zu überschreiben (z.B. würde das hier zu Zeichenfehlern im eigentlichen Panel führen), daher rufen wir zuerst die Methode der Superklasse auf.&lt;br /&gt;
Weiterhin zeigt uns das @Override an, dass wir eine Methode der Superklasse überschrieben haben (und der Compiler meckert uns an wenn, wir sie falsch geschrieben haben -&amp;gt; gängige Fehlerquelle vermieden).&lt;br /&gt;
&lt;br /&gt;
Generell also:&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine Klasse verwenden wollen, legen wir ein Feld mit dem Typ der Klasse an und verwenden das Feld.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wenn wir eine bestehende Klasse um neue Funktionalität erweitern wollen, dann erben wir von der Klasse.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
composition over inheritance&lt;/div&gt;</summary>
		<author><name>Headnut</name></author>
	</entry>
</feed>