Java

如无必要,勿增实体 — 无用接口越多,修改代码的风险越大

每当修改一个接口时,我们都要看看这个接口哪些地方在用,用的地方越多,我们就越要小心,需要回归测试的地方就越多。 所以说,应该尽量不要让接口的能力超过系统所需。比如说,如果现在只需要查询状态为“已付款”的订单,就不要写一个可以查询所有状态的万能接口;再比如,能private的接口就不要写成public。

有时候: 易读的代码不易改,易改的代码不易读

有没有同感? 比如说用了Command、Strategy模式的代码,改起来比较容易,因为解耦比较好,代码重复比较少; 而这些代码读起来却很费劲。 以Strategy模式为例,读者先要找出当前用的是哪个Strategy,回到主程序,然后再去这个Strategy子类里找出真正的处理逻辑。这其中要反复切换当前打开的类文件,并且还要用 Ctrl + T 找到具体的子类,一波三折,很费劲。

代码片段:在数据库COLUMN_NAME和Java类attrName之间互转

// firstName => FIRST_NAME private static String attrNameToColumnName(String attName) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < attName.length(); i++) { char c = attName.charAt(i); if (!(c <= ‘z’ && c >= ‘a’)) { sb.append("_"); } sb.append(c); } return sb.toString().toUpperCase(); } //FIRST_NAME => firstName private static String columnNameToAttrName(String attrName) { String …

代码片段:在数据库COLUMN_NAME和Java类attrName之间互转 Read More »

什么情况下应该将IOException包装成RuntimeException抛出,什么情况下不应该?

如果某个方法自己负责 流的打开/关闭,那这个方法就可以把IOException包装成RuntimeException再抛出 如果某个方法不负责流的打开和关闭,那它就应该把IOException如实抛出,上层的某个方法再根据这个IOException来关闭流 如果某个方法只不打开流,却要负责流的关闭,那这种写法本身就错了…… 谁打开,谁关闭,是处理IO流的一个准则。

跨层的API不好重用

这是老生常谈。但有时候你在争论时有可能一时间举不出任何例子,所以这里就写一个例子来阐述这个简单的道理。 比如说,网页上某表单的输入校验中引用了Session中的对象,在Servlet环境中这没问题;但有一天,客户要求提供一个Web Service,实现这个表单相同的功能,那就没办法重用这段校验代码,因为Web Service里找不到也不需要这个Session对象。 深入一点,可以说:     每个API都有个核心逻辑,这个逻辑的性质决定了它应处的层次;如果这个API引用该层次的上一层(比如Service引用了Session),那这个API就没办法重用;但如果它引用的是下一层(比如Service引用了DAO),那它的重用性就不受影响。

[POI-HSSF] 例示Logical Row/Column 和 Physical Row/Column 的区别

HSSF是处理Excel的API. 在这个API的语境中,Row/Column 有 "Logical" 和 "Physical" 的区别。 Logical和Physical分别是什么意思? 我不敢望文生义,去网上搜又搜不到,最后只好自己测试一下。 你看了下面的测试结果,就知道这两个东西的区别了: totallyEmpty.xls (全空的Excel) get Physical NumberOfRows: 0 get Logical FirstRowNum: 0 get Logical LastRowNum: 0 —-Let’s walk through the physical rows: 没有东西可遍历 —-Let’s walk through the logical rows: 没有东西可遍历 excelPath: row_2_4_6.xls (1、3、5行为空,2、4、6不空,1-based) get Physical NumberOfRows: 3 get Logical FirstRowNum: 0 get Logical LastRowNum: 5 —-Let’s walk …

[POI-HSSF] 例示Logical Row/Column 和 Physical Row/Column 的区别 Read More »

[Freemarker] Freemarker 处理XML时的 null-safe问题(例示)

设XML有三层, grandfather.father.son, 其中son元素包含了一个字符串,比如 <son>John<son>. 如果 father是必填,而son都非必填,那么我们如何安全地显示 son 的值? 答: ${grandfather.father.son[0]!} 如果father和son都不是必填的呢? 答: <#if grandfather.father[0] ??> ${grandfather.father.son[0]!} </#if>

[Freemarker XML Processing] XPATH里必须包含namespace,即使表达式只与默认 namespace有关

原文这样说的: =================================================================== Unfortunately, XPath does not support this idea of a default namespace. Thus, in XPath expressions, element names without prefixes always select the elements that does not belong to any XML namespace. However, to access elements in the default namespace you can directly use prefix D, for example: doc["D:book/D:chapter[title=’Ch1′]"].