Backend
guava-patterns
|
|
来源: Guava Wiki | GitHub: google/guava
of()静态常量 / copyOf()防御性拷贝 / builder()渐进构建// ✅ of() — 编译期已知元素(作静态常量)
public static final ImmutableSet<String> COLORS = ImmutableSet.of("red","green","blue");
// ✅ copyOf() — 防御性拷贝(接收外部集合)
class Foo {
final ImmutableSet<Bar> bars;
Foo(Set<Bar> bars) { this.bars = ImmutableSet.copyOf(bars); }
}
// ✅ builder() — 渐进构建(合并多来源)
ImmutableSet<Color> colors = ImmutableSet.<Color>builder()
.addAll(WEBSAFE_COLORS).add(new Color(0,191,255)).build();
// ❌ Collections.unmodifiableXXX — 冗长/不安全(持有引用仍可改)/低效(保留并发检查)
有明确的"未命中→加载"函数 → LoadingCache (get(key)自动加载)
加载函数因key而异 → Cache (get(key, callable)每次指定)
高频+高并发+追求性能 → Caffeine (API兼容,窗口TinyLFU)
多实例共享 → Redis
// ✅ LoadingCache: 统一加载函数
LoadingCache<String, User> cache = CacheBuilder.newBuilder()
.maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES)
.build(new CacheLoader<>() { public User load(String k) { return loadDB(k); }});
User u = cache.get("user:1"); // 自动加载+缓存
// ✅ 异步刷新(旧值仍可用,后台加载新值)
LoadingCache<String, Config> cfg = CacheBuilder.newBuilder()
.refreshAfterWrite(1, TimeUnit.MINUTES)
.build(new CacheLoader<>() { public Config load(String k) { ... }});
// ✅ RemovalListener: 异步拆除资源避免阻塞缓存
RemovalListener<String, Conn> listener = RemovalListeners.asynchronous(
notif -> notif.getValue().close(), executor);
// Joiner: 实例不可变,可作 static final 常量
private static final Joiner JOINER = Joiner.on(",").skipNulls();
JOINER.join(list); // "a,b,c"
Joiner.on("; ").useForNull("N/A").join("a",null,"c"); // "a; N/A; c"
// Splitter: 链式修饰 trimResults → omitEmptyStrings → limit
List<String> parts = Splitter.on(',').trimResults()
.omitEmptyStrings().splitToList("foo,bar,, qux"); // ["foo","bar","qux"]
// Map Splitter: URL参数解析
Map<String,String> m = Splitter.on('&')
.withKeyValueSeparator('=').split("id=123&name=foo");
// 固定长度切分
Splitter.fixedLength(3).splitToList("abcdefg"); // ["abc","def","g"]
// ✅ CharMatcher — 编译期类型安全,比正则更可读
CharMatcher.digit().retainFrom("abc123"); // "123"
CharMatcher.javaIsoControl().removeFrom(string); // 删除控制字符
CharMatcher.whitespace().trimAndCollapseFrom(" foo bar ", ' '); // "foo bar"
CharMatcher.inRange('a','z').or(CharMatcher.is('_')).matchesAllOf(input);
// ❌ 反模式:Pattern.compile("\\d+") — CharMatcher 更优
// ✅ Guava Preconditions: 格式化消息(类似printf)
checkNotNull(obj, "参数不能为空: %s", userId);
checkArgument(age > 0, "年龄必须>0: %s", age);
// ✅ Java Objects: 简单非空(无格式化)
Objects.requireNonNull(obj, "参数不能为空");
// 选择: 需要消息格式化 → Preconditions; 简单判空 → Objects
本技能不收集、存储或传输任何用户数据。