●コンバータクラスについて

FFYの基幹部分にconverterと言う機構があります。
この機構は異なる型を別の型に変換する役割を持ち、FFYのあらゆる箇所で使用されます。
これは
ffy_converters.xml
で定義され、FFYが提供するデフォルトの設定は以下の通りです。

<?xml version="1.0" encoding="UTF-8" ?>
<ffyc:converters xmlns:ffyc="http://ffy.afy-system.jp/ffy_converters" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ffy.afy-system.jp/ffy_converters ffy_converters.xsd">
	<converter>
		<class-name>null</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.NullConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.String</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.StringConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[Ljava.lang.String;</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.StringArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.util.List</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.ListConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.util.Map</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.MapConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.util.Date</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.DateConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.math.BigInteger</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.BigIntegerConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.math.BigDecimal</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.BigDecimalConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.Boolean</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.BooleanConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[Z</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.BooleanArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.Byte</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.ByteConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[B</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.ByteArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.Character</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.CharConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[C</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.CharArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.Double</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.DoubleConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[D</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.DoubleArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.Float</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.FloatConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[F</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.FloatArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.Integer</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.IntConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[I</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.IntArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.Long</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.LongConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[J</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.LongArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.lang.Short</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.ShortConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>[S</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.ShortArrayConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.sql.Date</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.SqlDateConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.sql.Time</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.SqlTimeConverter</converter-class-name>
	</converter>
	<converter>
		<class-name>java.sql.Timestamp</class-name>
		<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.SqlTimestampConverter</converter-class-name>
	</converter>
</ffyc:converters>

この定義の中で以下のように設定されています。
<converter>
<class-name>対象クラス完全限定名</class-name>
<converter-class-name>変換クラス完全限定名</converter-class-name>
</converter>

「対象クラス完全限定名」にマッチする値を別の型に変換するのに使用されるのが「変換クラス完全限定名」です。
例えば、String型を別の型に変換する場合は、
<converter>
<class-name>java.lang.String</class-name>
<converter-class-name>jp.co.afy.ffy.core.util.converter.defaults.StringConverter</converter-class-name>
</converter>
この設定が有効になり、StringConverterクラスの中で実装されているメソッドで変換されます。
これらのコンバータクラスは必ず、
jp.co.afy.ffy.core.util.converter.IConverter
を実装しています。
このインターフェイスでは、プリミティブのラップクラスとデータベースでよく使われる型への変換の為のメソッド宣言と
指定された特定の型へとキャスト不要で変換する為のメソッドが宣言されています。

デフォルトの実装に不満がある場合は、デフォルト実装を継承して必要な箇所をオーバーライドしたり、
直接IConverterを実装することによりより適切な変換ロジックを得られます。