承接第一部分從應用開發者角度介紹 JADT(Java Dictionary and Thesaurus API)基礎用法,本文將轉換視角至字典提供者/驅動程式開發者,深入剖析 JADT 架構細節、所有介面與類別的實作要點,並以範例驅動程式示範完整開發流程。
JADT 採驅動程式模式:字典提供者實作驅動程式端介面,提供資料存取點;應用程式透過統一的用戶端介面使用字典服務。此架構讓提供者不公開資料格式細節,開發者亦無須深入廠商專屬格式,雙方鬆耦合整合。
驅動程式獨立於 JADT 核心:提供者依據 JADT 規範實作所有介面與方法,打包為 JAR 部署。JADT 核心提供 JADTDriverFactoryManager 管理工廠註冊與驅動程式實例化。

用戶端與驅動程式工廠的橋樑。提供 registerJADTDriverFactory() 註冊工廠、getJADTDriverFactory(String factoryName) 取得工廠。驅動程式載入後由提供者負責註冊,用戶亦可透過 Class.forName(driverFactoryClass) 顯式載入。
建立驅動程式實例的工廠介面,必須實作 createJADTDriver()。建議於靜態區塊向 Manager 註冊:
public class JADTSampleDriverFactory implements JADTDriverFactory {
private static JADTSampleDriverFactory factory;
static {
try {
if (factory == null) factory = new JADTSampleDriverFactory();
JADTDriverFactoryManager.registerJADTDriverFactory(factory);
} catch (Exception ex) { /* handle */ }
}
public JADTDriver createJADTDriver() throws JADTException {
// 依 loading_strategy 屬性決定單例或多例
if ("multiple".equals(getProperty("loading_strategy"))) {
return new JADTSampleDriver(getProperty("JADTSampleDriverDir"));
}
// singleton pattern
if (driver == null) driver = new JADTSampleDriver(getProperty("JADTSampleDriverDir"));
return driver;
}
// 其餘屬性存取方法...
}
所有驅動程式屬性須編寫文件隨驅動程式發布。
主驅動程式介面,提供七大服務存取點:getDictionary()、getWordBook()、getSpellChecker()、getWordLister()、getTranslator()、getGrammarChecker()、getAnagrammizer()。建構子可接收資料路徑等初始化參數:
public class JADTSampleDriver implements JADTDriver {
private Properties props;
public JADTSampleDriver() { props = new Properties(); }
public JADTSampleDriver(String dataPath) {
this(); setProperty("JADTSampleDriverDir", dataPath);
}
public Dictionary getDictionary(String from, String to) throws JADTException {
try {
String dir = getProperty("JADTSampleDriverDir");
return (dir != null) ? new SampleDictionary(from, to, dir)
: new SampleDictionary(from, to);
} catch (JADTException e) {
throw new JADTException("DictionaryFailure", "Could not create dictionary", e);
}
}
// 其餘六大服務方法同樣模式實作...
}
單詞容器,不直接存取後端資源。支援迭代、前綴/後綴/子字串查找:
public class SampleWordList implements WordList {
private Vector<Word> words = new Vector<>();
private int currentPos = 0;
public int size() { return words.size(); }
public void addWord(Word w) { words.add(w); }
public void addWords(Collection<Word> c) { words.addAll(c); }
public Vector<Word> getAllWords() { return words; }
public void start() { currentPos = 0; }
public boolean hasMoreWords() { return currentPos < words.size(); }
public Word getNext() { return words.get(currentPos++); }
public WordList findWithPrefix(String prefix) { /* 實作 */ return null; }
public WordList findWithSuffix(String suffix) { /* 實作 */ return null; }
public WordList findWithSubstring(String sub) { /* 實作 */ return null; }
}
封裝單詞拼寫、類型、來源、發音、記錄(釋義/同義/反義等):
public class SampleWord implements Word {
private String word, type, source, pronunciation;
private DictionaryRecord meaning, synonym, antonym;
// 對應 getter/setter...
public static final int MEANINGS = 1, SYNONYMS = 2, ANTONYMS = 3;
}
鏈式物件,保存單詞描述、類型、用法、地區、發音等,支援 getNextRecord() 串聯多筆結果。
按字母序儲存單詞條目(釋義、類型、發音、來源、用法)。建構子依載入策略(lazy、single-shot、multiple-load)從資料庫/檔案讀取資料至記憶體結構(如 Hashtable)。核心方法 getMeaning(Word) 從儲存庫提取記錄。
public DictionaryRecord getMeaning(Word word) {
String key = word.toString().toLowerCase();
if (words.containsKey(key))
return ((Word)words.get(key)).getRecord(Word.MEANINGS);
return null;
}
提供同義詞、反義詞、上位詞、下位詞、整體名詞、部分名詞六大關係查詢。實作需建立各關係的資料儲存庫(如 Hashtable<String, WordList>),方法回傳 DictionaryRecord 鏈。範例:
public DictionaryRecord getSynonyms(Word word) throws JADTException {
WordList syn = wordsSyn.get(word.toString());
if (syn == null || syn.size() == 0) return null;
DictionaryRecord first = null, curr = null;
for (Word w : syn.getAllWords()) {
if (first == null) { first = curr = new DictionaryRecord(); }
else { curr.setNextRecord(new DictionaryRecord()); curr = curr.getNextRecord(); }
curr.setWordName(w.toString());
}
return first;
}
// 其餘 getAntonyms、getHypernyms、getHyponyms、getHolonyms、getMeronyms 同理
// 另提供 isSynonyms、isAntonyms 等布林判斷方法
check()、correct()、suggestSimilar()。WordList。Anagrammise()、isAnagram()。check()、correct()、suggestSimilar()。translate()(單詞)、translateSentence()(句子),支援本地化/國際化。將所有實作類別組織為套件結構,打包成 JAR:
com/ibm/jadt/ // JADT 核心介面與基礎類
com/ibm/jadtdrivers/SampleDriver/
JADTSampleDriver.class
JADTSampleDriverFactory.class
SampleWord.class
dictionary/SampleDictionary.class
spellchecker/SampleSpellChecker.class
wordbook/SampleWordBook.class
wordlist/SampleWordList.class
wordlister/SampleWordLister.class
anagrammizer/SampleAnagrammizer.class
grammarchecker/SampleGrammarChecker.class
translator/SampleTranslator.class
部署該 JAR 至應用程式類別路徑即可使用。
本文完整說明了 JADT 驅動程式開發的架構細節、介面實作範例與打包部署流程。透過本系列兩篇文章,您已從使用者與提供者雙重視角全面掌握 JADT 技術,可據此建構整合字典、辭典、拼寫檢查、翻譯等語言服務的 Java 應用程式。