Android切词工具——BreakIterator(3)

本文分析了Android中ICU BreakIterator的实现原理,重点关注初始化过程,包括如何获取BreakIterator实例,以及涉及到的缓存、线程安全和反射机制。通过源代码解析,探讨了BreakIteratorFactory在类加载中的角色和服务注册。
摘要由CSDN通过智能技术生成

5.ICU BreakIterator实现原理分析

上一篇性能测试,看到耗时和内存占用上的一些现象。当然,对于一个开源的东西,最高效的方式还是研究源代码了。接下来我们会深入到ICU源代码简要看看分词的实现方法。

5.1初始化:获取BreakIterator实例

以我们例子中用到的获取当前默认Locale的WordInstance为例:

java.text.BreakIterator.getWordInstance() ->
java.text.BreakIterator.getWordInstance(Locale.getDefault()) ->
java.text.IcuIteratorWrapper new IcuIteratorWrapper() ->
android.icu.text.BreakIterator.getWordInstance(ULocale where) ->
android.icu.text.BreakIterator.getBreakInstance(where, KIND_WORD)

OK,到了第一个关键逻辑:
android.icu.text.BreakIterator

    /**
     * Returns a particular kind of BreakIterator for a locale.
     * Avoids writing a switch statement with getXYZInstance(where) calls.
     * @internal
     * @deprecated This API is ICU internal only.
     */
    @Deprecated
    public static BreakIterator getBreakInstance(ULocale where, int kind) {
        if (where == null) {
            throw new NullPointerException("Specified locale is null");
        }
        if (iterCache[kind] != null) {
            BreakIteratorCache cache = (BreakIteratorCache)iterCache[kind].get();
            if (cache != null) {
                if (cache.getLocale().equals(where)) {
                    return cache.createBreakInstance();
                }
            }
        }

        // sigh, all to avoid linking in ICULocaleData...
        BreakIterator result = getShim().createBreakIterator(where, kind);

        BreakIteratorCache cache = new BreakIteratorCache(where, result);
        iterCache[kind] = new SoftReference<Brea
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值