??xml version="1.0" encoding="utf-8" standalone="yes"?> 现象 很多cȝ命名相同Q例如:常见于异常、常量、日志等c)Q导致在importӞ有时候张冠李_q种错误有时候很隐蔽。因为往往同名的类功能也类|所以IDE不会提示warn?/p>
解决 写完代码Ӟ扫视下import部分Q看看有没有不熟(zhn)的。替换成正确导入后,要注意下注释是否也作相应修改?/p>
启示 命名量避开重复名,特别要避开与JDK中的c重名,否则Ҏ(gu)导入错,同时存在大量重名c,在查找时Q也需要更多的辨别旉?br /> 现象 有时候调用APIӞ会想当然的通过名字直接自信满满地调用,D很惊讶的一些错误: CZ一Qflag是trueQ?/p> 可能老是false?/p>
CZ二:q是d的今天吗Q今q是2012q?span style="white-space: pre-wrap">Q不考虑闰年Q?l果q是2012q_ 下面的才是去q_ 解决办法 问自己几个问题,q个Ҏ(gu)我很熟?zhn)吗?有没有类似的API? 区别是什么?q例一而言Q需要区别的如下Q?/p> 启示 名字L更详l点Q注释更清楚点,不要不经了解、测试就惛_然的用一些APIQ如果时间有限,用自己最为熟(zhn)的API?/p>
现象 有时候溢出ƈ不难Q虽然不常复玎ͼ CZ一Q?/p> x是多?竟然?2147483648Q明明加?之后q是long的范围。类似的l常出现在时间计: CZ二: 在检查是否ؓ正数的参数校验中Qؓ了避免重载,选用参数number, 于是下面代码l果于0Q也是因为溢出导_ 解决 启示 Ҏ(gu)字运用要保持敏感Q涉及数字计就要考虑溢出Q涉及除法就要考虑被除数是0Q实在容U不下了可以考虑B(ti)igDecimal之类?/p>
现象 有时候觉得log都打了,怎么找不刎ͼ CZ一Q没有stack traceQ?/p> CZ二:找不到l(f)ogQ?/p> 解决 启示 现象 在DCL模式中,L忘记加一个Volatile?/p> 解决 毋庸|疑Q加上一个吧Qsynchronized 锁的是一块代码(整个Ҏ(gu)或某个代码块Q,保证的是q?#8221;?#8220;代码的可见性及原子性,但是instance == nullW一ơ判断时不再范围内的。所以可能读出的是过期的null?/p>
启示 我们L觉得某些低概率的事g很难发生Q例如某个时间ƈ发的可能性、某个异常抛出的可能性,所以不加控Ӟ但是如果可以Q还是按照前人的“最佛_?#8221;来写代码吧。至不用过多解释ؓ啥另辟蹊径?/p>
现象 在释攑֤个IO资源Ӟ都会抛出IOException Q于是可能ؓ了省事如此写Q?/p> 假设bos关闭p|Qbisq能关闭吗?当然不能Q?/p>
解决办法 虽然抛出的是同一个异常,但是q是各自捕获各的为好。否则第一个失败,后一个面没有机会去释放资源了?/p>
启示 代码/模块之间可能存在依赖Q要充分识别对相互的依赖?/p>
现象 如题所提,作ؓ防M式编E常用的方式Q断aQ写在品代码中做参数校验等。例如: 解决 换成正常的统一的参数校验方法。因为断a默认是关闭的Q所以v不v作用完全在于配置Q如果采用默认配|,l历了eventList != nulll果q没有vC用,徒劳无功?/p>
启示 有的时候,代码起不起作用,不仅在于用例Q还在于配置Q例如断a是否启用、logU别{,要结合真实环境做有用~码?/p>
现象 先来比较三组例子Q看看那些看着更顺畅? CZ一Q?/p> CZ二: CZ三: 解决 启示 在编码过E中Q不是参数的顺序还是命名都量l一Q这LL认知负担会很,不要要用户容易犯错或qh。例如用枚D代替string从而不让用戯惑到底传什么string, 诸如此类?/p>
现象 存在下面两则CZQ?/p>
CZ一Q该不该记录日志Q?/p> CZ二:C么别日志? 在用L录系l中Q每ơ失败登录: 解决 启示 日志改不改记Q记成什么别?如何讎ͼq些都是问题Q一定要Ҏ(gu)具体情况Q需要考虑Q?/p>
现象 在JAVA中,我们常用Collection中的Map做Cache,但是我们l常会遗忘设|初始容量?/p> 解决 初始定w的媄响有多大Q拿LinkedHashMap来说Q初始容量如果不讄默认?6Q超q?6×LOAD_FACTOR,会resize(2 * table.length),扩大2倍:采用 Entry[] newTable = new Entry[newCapacity]; transfer(newTable)Q即整个数组CopyQ?那么对于一个需要做大容量CACHE来说Q从16变成一个很大的数量Q需要做多少ơ数l复制可惌知。如果初始容量就讄很大Q自然会减少resize, 不过可能会担心,初始定w讄很大Ӟ没有Cache内容仍然会占用过大体U。其实可以参考以下表格简单计下, 初始时还没有cache内容, 每个对象仅仅?字节引用而已?/p>
1. U结的同?/h2>
2. 惛_然的API
boolean flag = Boolean.getBoolean("true");
Calendar calendar = GregorianCalendar.getInstance();
calendar.roll(Calendar.DAY_OF_YEAR, -365);
calendar.add(Calendar.DAY_OF_YEAR, -365);
Boolean.valueOf(b) VS Boolean.parseBoolean(b) VS Boolean.getBoolean(b);
3. 有时候溢出ƈ不难
long x=Integer.MAX_VALUE+1;
System.out.println(x);
数字1×数字2×数字3…
Number i=Long.MAX_VALUE;
System.out.println(i.intValue()>0);
4. 日志跑哪了?
} catch (Exception ex) {
log.error(ex);
}
} catch (ConfigurationException e) {
e.printStackTrace();
}
5. 遗忘的volatile
private static CacheImpl instance; //lose volatile
public static CacheImpl getInstance() {
if (instance == null) {
synchronized (CacheImpl.class) {
if (instance == null) {
instance = new CacheImpl ();
}
}
}
return instance;
}
6. 不要影响彼此
public static void inputToOutput(InputStream is, OutputStream os,
boolean isClose) throws IOException {
BufferedInputStream bis = new BufferedInputStream(is, 1024);
BufferedOutputStream bos = new BufferedOutputStream(os, 1024);
….
if (isClose) {
bos.close();
bis.close();
}
}
7. 用断a取代参数校验
private void send(List< Event> eventList) {
assert eventList != null;
}
8. 用户认知负担有时候很?/h2>
public void caller(int a, String b, float c, String d) {
methodOne(d, z, b);
methodTwo(b, c, d);
}
public void methodOne(String d, float z, String b)
public void methodTwo(String b, float c, String d)
public boolean remove(String key, long timeout) {
Future< Boolean> future = memcachedClient.delete(key);
public boolean delete(String key, long timeout) {
Future< Boolean> future = memcachedClient.delete(key);
public static String getDigest(String filePath, DigestAlgorithm algorithm)
public static String getDigest(String filePath, DigestAlgorithm digestAlgorithm)
9. 忽视日志记录时机、?/h2>
catch (SocketException e)
{
LOG.error("server error", e);
throw new ConnectionException(e.getMessage(), e);
}
LOG.warn("Failed to login by "+username+");
10. 忘设初始定w
cache = new LRULinkedHashMap< K, V>(maxCapacity);
Java type
Bytes required
boolean
1
byte
char
2
short
int
4
float
long
8
double
启示
不仅是map, q有stringBuffer{,都有定wresize的过E,如果数据量很大,׃能忽视初始容量可以考虑讄下,否则不仅有频J的 resizeq容易浪费容量?/p>
在Java~程中,除了上面枚D的一些容易忽视的问题Q日常实践中q存在很多。相信通过不断的ȝ和努力,可以我们的E序完美呈现l读者?/p>
原文Q?br />http://www.infoq.com/cn/articles/10-java-questions-easy-to-ignore