当数据可以从多个位置查询并且应该在第一个非空实例上返回时,有没有办法避免使用 if/else 语句?
我正在尝试为来自 3 个不同位置的用户加载首选项(用户首选项、组首选项和系统首选项)。例如:
Preference getPreference(User user, Preference.Type type) {
Preference preference = getUserPreferenceFor(user, type);
if (preference != null) {
return preference;
}
preference = getGroupPreferenceFor(user, type);
if (preference != null) {
return preference;
}
return getSystemPreferenceFor(user, type);
}
我想避免使用这些 if 检查并将这些方法链接在一起,以便行为保持不变,但代码不会有这种丑陋的重复。
我想到了几个解决方案,但这些解决方案都不是优雅的。例如,一种方法是让这些方法中的每一个都提供默认值本身,但这只会分散 if 语句。
Preference getPreference(User user, Preference.Type type) {
Preference preference = getUserPreferenceFor(user, type);
if (preference != null) {
return preference;
}
return getGroupPreferenceFor(user, type);
}
Preference preference getGroupPreferenceFor(
if (preference != null) {
return preference;
}
return getSystemPreferenceFor(user, type);
}
另一种方法是使用一些提供者接口,为每个提供者创建子类并遍历提供者,直到找到第一个非空值。
public interface PreferenceProvider {
Preference getPreference(User user, Preference.Type type);
}
public class UserPreferenceProvider implements PreferenceProvider {
public Preference getPreference(User user, Preference.Type type) {
...
}
}
... group and system provider the same way
final static PreferenceProvider[] providers = new PreferenceProvider[] {
new UserPreferenceProvider(),
new GroupPreferenceProvider(),
new SystemPreferenceProvider()
};
Preference getPreference(User user, Preference.Type type) {
Preference preference = null;
for (PreferenceProvider provider : providers) {
preference = provider.getUserPreferenceFor(user, type);
if (preference != null) {
return preference;
}
}
}
最后一个足够接近,但它仍然有这个空检查(我想避免),我非常有信心有一些设计模式可以解决这个问题。就是想不起来是哪一个...