<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      buguge - Keep it simple,stupid

      ? 知識就是力量,但更重要的,是運用知識的能力? why buguge?

      導航

      開竅了!如何為緩存工具類(CacheUtil中的static方法)定義interface(上)

      兩個不同策略的緩存工具類

      在我們系統的基建包里,有一個基于redis的get/set等基礎api封裝的 CacheUtil
      CacheUtil 主要有下面2個靜態方法:

      import java.util.function.Supplier;
      
      public class CacheUtil {
          /**
           * 獲取緩存。如果沒有,則設置
           */
          public static <T> T getCache(String key, long seconds, Supplier<T> supplier) {
              return getCache(key, seconds, false, supplier);
          }
      
          /**
           * 獲取緩存。如果沒有,則設置
           */
          public static <T> T getCache(String key, long seconds, boolean cacheNull, Supplier<T> supplier) {
              Object obj = redisUtil.get(key); // 這里的RedisUtil類封裝了 redis 的get/set等基礎操作
              if (null == obj) {
                  T value = supplier.get();
                  ......
                  redisUtil.set(key, value, seconds);
                  return value;
              } else {
              	......
                  return (T) obj;
              }
          }
      }
      

      隨著后續系統迭代過程中,我增加了一個基于本地緩存框架 hutool-cache 的 LFUCache、TimedCache 來實現的 LocalCacheUtil
      CacheUtil 一樣的是,LocalCacheUtil 中也主要有下面2個靜態方法:

      import java.util.function.Supplier;
      
      public class CacheUtil {
          /**
           * 獲取緩存。如果沒有,則設置
           */
          public static <T> T getCache(String key, long seconds, Supplier<T> supplier) {
              return getCache(key, seconds, false, supplier);
          }
      
          /**
           * 獲取緩存。如果沒有,則設置
           */
          public static <T> T getCache(String key, long seconds, boolean allowCacheNullOrEmpty, Supplier<T> supplier) {
              return getCache(timedCache, key, seconds, allowCacheNullOrEmpty, supplier);
          }
      
          private static <T> T getCache(Cache<String, Object> myCache, String key, Long seconds, boolean allowCacheNullOrEmpty, Supplier<T> supplier) {
              Object cachedValue = myCache.get(key, false);
              if (cachedValue != null) {
                  return (T) cachedValue;
              }
              // 允許緩存null值的情況下,如果存在緩存,則直接返回
              if (allowCacheNullOrEmpty && myCache.containsKey(key)) {
                  return (T) myCache.get(key, false);
              }
      
              ......
              T result = supplier.get();
              if (seconds == null) {
                  myCache.put(key, result);
              } else {
                  myCache.put(key, result, TimeUnit.SECONDS.toMillis(seconds));
              }
              return result;
          }
      }
      

      如何為兩個緩存工具類抽取公共能力?

      翻閱 git 提交記錄,我發現 CacheUtil 是2020-09 創建的,LocalCacheUtil 是 2022-12 創建的。
      雖然兩年多過去了,但這其中有一個困擾著我的程序設計問題并沒有被遺忘。

      這個程序設計問題是, CacheUtilLocalCacheUtil 的職責是相同的,兩者都是用來緩存數據。那么,如果能夠為兩者抽象出來一個緩存數據的 interface,該多香啊!

      可是, getCache 方法是 static 靜態方法。我們知道,靜態方法是無法實現接口的

      我總不能把 getCache 方法改為非靜態方法吧?

      我不能。倒不是因為需要改所有的調用代碼,而是在程序設計原則中,工具類的設計理念通常是為了提供一組相關的實用方法,這些方法不依賴于類的實例狀態,而是專注于執行特定的功能。代碼實現中,我們通常將工具類的方法定義為 static 或者通過其他方式(如私有化構造函數)防止類在外部被實例化

      那么,我沒有辦法了!

      我曾經在遙遠的2017年聽過一個架構師講過類似場景的解決方案,可惜的是,忘卻了,腦子里只留下“講解過”這三個字了。

      直到最近,我才想到方案。(>>點擊下一篇查看

      posted on 2025-04-28 09:11  buguge  閱讀(67)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 国产成人精彩在线视频| 国产精品最新免费视频| 亚洲热线99精品视频| 亚洲国产精品日韩在线 | 亚洲蜜臀av乱码久久| 黑人巨大精品欧美| 成人爽a毛片免费| 最新亚洲av日韩av二区| 万源市| 熟妇人妻无码中文字幕老熟妇| 沁水县| 国产mv在线天堂mv免费观看| 亚洲欧美日韩综合在线丁香 | 四虎永久精品免费视频| 四虎成人高清永久免费看| 骚虎视频在线观看| 狠狠干| 临泽县| 98久久人妻少妇激情啪啪| 69人妻精品中文字幕| 99精品国产丝袜在线拍国语 | 中年国产丰满熟女乱子正在播放 | 亚洲精品久久国产高清| 白白发布视频一区二区视频| 亚洲中文字幕日产无码成人片| 亚洲av无码精品色午夜蛋壳| 日韩精品 在线 国产 丝袜| 欧美午夜成人片在线观看| 色悠久久网国产精品99| 亚洲国产欧美在线看片一国产| 国产一级特黄性生活大片| 成人午夜av在线播放| 国产成人高清精品亚洲| 韩国无码av片在线观看| 国产sm重味一区二区三区| 婷婷99视频精品全部在线观看| 国产精品区免费视频| 亚洲一二三区精品与老人| 精品乱码一区二区三四五区| 国产高跟黑色丝袜在线| 欧美亚洲综合久久偷偷人人|