static 内部类:如果一个类要被声明为 static 的,只有一种情况,就是静态内部类。静态内部类使用场景一般是当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建的时候会考虑采用静态内部类的设计。
典型应用场景:如果类的构造器或静态工厂中有多个参数,设计这样类时,最好使用 Builder 模式,特别是当大多数参数都是可选的时候,例如 Android 里的 AlertDialog:
AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle("标题").setMessage("你好呀").create();
修饰代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号 {}
括起来的代码,作用的对象是调用这个代码块的对象。
synchronized(this)
同步代码块时,其他试图访问该对象的线程将被阻塞。 synchronized(this)
同步代码块时,另一个线程仍然可以访问该对象中的非 synchronized(this)
同步代码块。 当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的对象来充当锁:
private byte[] lock = new byte[0]; synchronized(lock) { // todo 同步代码块 }
修饰普通方法:synchronized 修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来的范围,而修饰方法范围是整个函数。
synchronized(ClassName.class) { // todo 同步代码块 }
volatile,字面意思是 易变的,不稳定的
, 一般用于修饰变量。
assert,字面意思是 声称,断言
,有两种用法:
assert <boolean 表达式>
如果表达式为 true,则程序继续执行。
如果为 false,则程序抛出 AssertionError,并终止执行。
assert <boolean 表达式> : <错误信息表达式>
如果表达式为 true,则程序继续执行。
如果为 false,则程序抛出 java.lang.AssertionError
,并输出<错误信息表达式>。
在 Android 开发中除非在 debug 模式下,否则 assert 根本无法工作,所以不太建议在生产环境下使用 assert,此外主流的 Java IDE 工具默认都没有开启断言检查功能。
adb shell setprop debug.assert 1