Effective C++ 的笔记
写在前面
我觉得作为一个喜欢编程的人不会写C++好像有点说不过去。虽然我一直在写Java,然后也一直觉得C++写起来非常麻烦。不过就算是麻烦也应该先写一段时间再说对不对。至少C++是非常有趣,非常强大的,值得深入学习,虽然学不会。
这边是我记的Effective C++的笔记。有时间我再去看一看More Effective C++和C++ Primer, C++ Primer Plus。先记在计划里吧。
这本书里面介绍了55个守则,如果我们熟悉了这些守则,对我们在C++的开发是很有好处的,至少是前人总结的非常优秀的经验。我觉得一个写了三年多代码的人来看这本书还是比较轻松的,当然还是需要有一定的C++基础。Primer的书太厚了,一时半会儿看不完,有机会再看吧。
Java中的一些有趣的内容
enum
enum也就是Java中的枚举类,我们可以声明一个类为如下的几个具体类型:
class
interface
enum
annotation
(@interface
)
那么enum中可以进行什么操作,enum是怎么实现的?
enum通常可以进行的操作
通常我们会拿它来定义一些枚举值,比如
虽然我很想翻出几个java中自带的enum但是想了几个都是static final XXX
什么的
还是随便来一个吧
1 | public enum Color { |
也就是定义一些常量,然后我们可以给它们加一点属性…
1 | public enum Color { |
再加一点方法…
1 | public enum Color { |
我们可以在里面放一些
- 属性
- 普通方法
- 抽象方法
- 构造函数
如果是构造函数或者是抽象方法,我们需要在每一个枚举值中进行重载,也就是下面这个写法:
1 | BLUE("蓝色", 0, 0, 255) { |
看起来就像实现一个匿名内部类一样(其实实际上也是的)
实现原理
我们操作完上面的步骤,现在看看它是怎么实现的
实际上enum在Java1.5开始才加入Java中,我们定义的枚举类和里面的枚举值实际上是继承了java.lang.Enum
的类和它的匿名内部类的实现。
即enum XXX
实际上是abstract class XXX extends Enum<XXX>
而里面的每一个枚举值A
,B
,C
是这个类的几个static final
实例。
由于XXX
是抽象类,所以每一个实例初始化都需要override构造方法和抽象方法,来实现一个匿名内部类,每一个枚举值都是抽象类里面的不同匿名内部类的实例。
这样就可以达到一个枚举的效果。
LocalDateTime
@since 1.8
java.time.LocalDateTime是Java8开始加入的类。
操作起来应该比较舒服了。
此外LocalDateTime是与时区无关的,它不能单独表示某一个确切的时间点。
(我们在数据库里存的DateTime呢)
最大和最小值
LocalDateTime.MIN
和LocalDateTime.MAX
可以表示-999999999-01-01T00:00:00和+999999999-12-31T23:59:59.999999999。
也就是说如果使用LocalDateTime, 几乎没有需要担心有时间表示不了的情况。
一些方法
LocalDateTime实际上是由LocalDate和LocalTime组成的。
可以用now(), of()等方法构造一个LocalDateTime
而LocalDateTime对象可以使用各种minus, plus方法来获得另一个时间,当然也可以使用with某个value的方法。
也就是说如果我们需要获得上一周时间,上一周开始时间,等等,都是可以很方便地操作的
这些方法的返回值是一个新的LocalDateTime对象,所以我们可以…..调用来拿到我们想要的时间。
(不过还是JodaTime的方便一些)
LocalDate和LocalTime
LocalTime中的每一个field都是用一个单独的int来存储的。
(这个实现一点都不复杂)
收集一些待解决的问题
- Java里面声明一个数字的时候可以用下划线分隔… 如
123_123_123
- 所以不写访问权限的时候是可以从哪里访问来着…
- Objects.requireNonNull();似乎是用来抛出异常的