Hadoop的配置文件有很多选项,一个个看完都需要一段时间。但是,hadoop-site.xml的配置好多都可以忽略,Hadoop还是可以运行的,这里就是默认配置的运用(注意:除非一些必须的,配置用户都可以不用填写)。其实,看看JDK中Properties类提供getProperty()的方法,有重载方法:
public String getProperty(String key);
public String getProperty(String key, String defaultValue);
后一个方法,就可以自己提供一个默认值。
下面说说,在开发 印象网盘搜索 中,默认值的典型用法:
1、配置文件的处理 - 网盘站点的默认值
从网盘搜索的结果中可以看到,系统提供好几个不同的网盘搜索,如:百度网盘、360云盘、金山快盘、腾讯微云、华为网盘、115网盘等,在代码中是这样处理:
public static Site[] DISK_SITES = { new Site("pan.baidu.com", "百度网盘") };
...
DISK_SITES = getConfig("SITE_DISK", DISK_SITES);
getConfig方法中,后一个就是当系统没有配置时,就返回自身的硬编码“百度网盘”。
2、请求参数的处理
当用户访问
印象网盘搜索 时,默认是跳转到“网盘”这个选项卡,搞前端一看就知道,有几个主要的URI,"/page","/disk","/express"等。如果用户不是以这样www.impress.pw/disk这个链接访问,其他访问时,岂不是要返回 404,后台在处理时,就做一个跳转:
if (dispatchHome(req)) {
req.getRequestDispatcher(HOME_URI).forward(req, response);
return;
}
...
boolean dispatchHome(HttpServletRequest req) {
if (ROOT_URI.equals(req.getRequestURI()))
return true;
/** `express` has its own home-page. */
if ((ROOT_URI + Tab.EXPRESS.getDesc()).equals(req.getRequestURI()))
return false;
for (Tab t : Tab.values())
if ((ROOT_URI + t.getDesc()).equals(req.getRequestURI()))
return true;
return false;
}
就相当于:访问www.impress.pw/ www.impress.pw/disk(/page..) 就跳转到首页。
3、转换枚举类时(慎用)
我这里比较合适,一般情况下不太合适(比如,用户传入一个错误的参数你还返回一个正确的枚举类型有点说不过去)。一般的做法是:public static Tab tab(String desc) {
for (Tab t : Tab.values()) {
if (t.desc.equals(desc))
return t;
}
throw new IllegalArgumentException("Has not a Tab named `" + desc + "`");
}
但是,我这里是“约定优先”,如果找不到,就返回Tab.DISK:
public static Tab tab(String desc) {
for (Tab t : Tab.values()) {
if (t.desc.equals(desc))
return t;
}
return DISK;
}
4、不适用的场景:
- 必须的配置(如IP地址等);
- 描述不清,如用户传入错误的参数,用户得到的答案还是正确的,典型是:网络下载文件。