PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 构造方法如果是private,就代表除了这个类自己的方法外,都无法创建这个类的实例。 那么配套的获取实例的方法,就必须是static的,因为非static的方法必须要通过非空的引用来调用,这就成了先有鸡先有蛋的问题了。 而static的方法直接用类名就可以调用。
作者回复: 是的,这种组合可以让类创建实例之前有个检查。 比如说一个类A的构造方法需要传入一个Connection参数,但是这个参数不能为null。但是如果new A(null),即使在构造方法里抛出异常,A的实例其实也是创建出来了,只是没有完成构造方法的初始化。 如果是private+public static 的组合,就可以在static 方法里判断,然后不符合条件直接返回null或者抛出异常,避免创建一个状态不对的A对象。 还有就是可以对A的对象进行缓存,不是任何参数都返回一个A的对象(当然这个也可以坐在外面,但是private可以更彻底) 但是这个也不是没有短处: 写着麻烦,多一个方法 用着麻烦,一般都是直接new,静态方法还得去扒拉静态方法 不一定有用:不是所有的实例都需要一个静态方法检查参数合法性或者缓存。
作者回复: 囧,敲了半天本来想编辑,结果手一抖给删了。 是这样的,我原封不动的用你给的format的日期字符串,解析也没有错误。我试过JDK8和11,都么有问题。 但是我点进去SimpleDateFormat的parse方法,它报错的地方的源代码如下: ParsePosition pos = new ParsePosition(0); Date result = parse(source, pos); if (pos.index == 0) throw new ParseException("Unparseable date: \"" + source + "\"" , pos.errorIndex); return result; 抛出错误的地方,有个pos.errorIndex告诉了是解析到哪个字符出错了。这个很有用,但是异常的message里却没有给出来这个信息。我也是服气了。 建议你在linux服务器上catch住这个exception,人肉输出异常的errorOffset属性,再结合format和date字符串,就很容易判断是哪里不匹配了。 我的一个猜测是空格的问题。 “MMM d,yyyy hh:mm:ss a z”可以匹配你给的日期字符串,但是如果d和yyyy之间多一个空格,而日期字符串没有空格,就会出错,也就是“MMM d, yyyy hh:mm:ss a z”无法解析“May 1,2019 12:27:07 AM PDT”。 你结合exception的errorOffset看一下吧,盯准空格别漏了。
作者回复: public的方法可能被别人用到,维护这个方法的人就不能随便改public方法的签名
作者回复: 4也是对的,不需要严格来说,无论怎么说它都不是构造方法。
作者回复: 工厂方法更灵活,可以根据参数返回不同类型的instance
作者回复: ✅
作者回复: 如果你想学习面向对象,Java可以说是最好的选择。这个教程中第二篇就是重点围绕面向对象讲的。
作者回复: 收到,这也是第二篇的一个变化,就是把语法点都放在代码里而不是PPT里。好处是语法的解释直接以注释的方式放在代码上,更直观,减少了代码和PPT之间的切换。但是有时候就会感觉比较乱,尤其是一个语法点涉及多个地方的代码的时候。一方面建议你根据代码里的// >> TODO个格式的语法点自己再复习一边语法,另一方面,我会注意讲一个语法完整的讲解,而非跟着代码跳着讲。谢谢
作者回复: 滴, 学生卡.