Zajímavým jevem je, že člověk pohybující se v jistém oboru na úrovni nejvyšší abstrakce a žhavých novinek často zapomíná samotné základy. Matematici snící o univerzálních algebrách neumí sčítat, manažeři se nedokáží v obchodě rozhodnout, který salám koupit na večeři, a J2EE vývojáři si jen matně rozpomenou na různá zákoutí jazyka Java.
Právě jsem řešil návrhový problém, kdy jsem měl v projektu třídy,
která dědily jinou. A kvůli Spring AOP a jeho pohodlné správě vnořených
transakcí jsem chtěl dědit z JpaTemplate. A teď co
s tím?
Moje nadtřída vypadala takto (zkráceno):
public abstract class Action {
protected static Logger log;
static{
log = Logger.getLogger(Action.class.getName());
}
public Action(){}
public abstract String execute( AppContext appContext, Map<String, Object> params, Map<String, Object> mapOutput );
public static final String SUCCESS = "success";
public static final String ERROR = "error";
public class Output{
// -- Fields -- //
String view;
Map<String, Object> data;
public Output( String view, Map<String, Object> data ) {
this.view = view;
this.data = data;
}
// -- Getters / Setters -- //
public Map<String, Object> getData() { return data; }
public void setData( Map<String, Object> data ) { this.data = data; }
public String getView() { return view; }
public void setView( String view ) { this.view = view; }
}
}// class Action
V podstatě velmi jednoduchá třída. Když jsem se na ni zběžně
podíval, zdálo se mi, že na to, abych z ní udělal interface je moc
složitá. Až když jsem zjistil, že nepoužívat JpaTemplate by
bylo ještě složitější, než se vykašlat na polymorfizmus a tuto
nad-třídu zcela zrušit, podíval jsem se ještě na popis
interface z tutoriálu od Sunu.
Zde stoji:
In the Java programming language, an interface is a reference type, similar to a class, that can contain only constants, method signatures, and nested types.
Přičemž i vnitřní třída je vnořený typ. JpaTemplate
používá vlastní referenci na logger, takže log
jsem mohl vyhodit; A jinak v mojí třídě nic „závadného“ (až na
zbytečný konstruktor) nebylo. A krásná refaktorizace je na světě :-)
Takže až budete někde potřebovat vícenásobnou dědičnost, vzpomeňte
si, že do interface můžete kromě metod dávat i konstanty a
hlavně vnitřní třídy.
Pokud chcete v nějaké třídě uklidit, možná vám pomůže použití vnitřní třídy.
class VnějšíTřída {
class VnitřníTřída {
...
}
}
Vnitřní třída (inner class) neboli nestatické vnořené třídy mají zajímavou vlastnost: Jejich instance je součástí instance vnější třídy:

(Vnitřních koleček by mohlo být i více, protože pro daný objekt vnější třídy můžete vytvořit libovolný počet instancí vnitřní třídy.)
Díky tomu z ní můžete přistupovat ke všem jejím prvkům:
class MujProgram(){
Logger log;
// inicializace v konstruktoru...
public MujProgram(){ ... }
class ProvadecAkci {
private void provedAkci(){
log.info("Provádím akci");
}
private void provedJinouAkci(){
log.info("Provádím jinou akci");
}
}
}
Jedná se tedy o podobný mechanismus, jako vnořené funkce v Pascalu (které kdysi sháněl můj kamarád Karel Kyrian :-)
Osobně vnitřní třídy používám pro zapouzdření implementace
rozhraní (interface), například pro obsluhu událostí: Vnitřní
třída implementuje rozhraní *Listener a její instanci potom
u zdroje událostí registruji jako posluchače.
MySQL standardně nastavuje kódování spojení na ISO-LATIN-1 (tuším). Proto je třeba spojení přenastavit.
JDBC nemá přímou standardní metodu, která by změnu prováděla. Proto je třeba MySQL spojení nastavit jinak – a to parametrem v „Connection URL“:
jdbc:mysql://dev:3306/myDatabase?autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Pokud byste chtěli kódování Windows-1250, použijte hodnotu
Cp1250.
Na stránkách MySQL pak najdete ostatní kódování,
která MySQL podporuje.
Vyzkoušeno s Connector/J 5.1.6, Java 1.6.x MySQL 5.0.53.
Další zajímavé tipy ohledně Unicode a Javy najdete na http://www.macroware.cz/…are/unicode/.
Klíčová slova: databáze, JDBC, MySQL, nastavení, kódování, iBatis, Hibernate. Keywords: database, JDBC, character set, setting, charset.
try{
File dir = new File("./spisy_xml");
if( !dir.exists() && !dir.mkdirs() )
throw new Exception("Nepodařilo se vytvořit adresář "+dir.getPath());
}
catch( Exception ex ){
throw new Exception("Chyba při vytváření adresáře pro XML soubory.", ex);
}
Klíčová slova: java, j2se, adresář, složka, kontrola, existence, existuje, vytvoření. Keywords: java, directory, folder, check, existence, exists, create.