final、finally、finalize的区别 - 《Java核心技术》笔记

final可以用来修饰变量、类、方法,final修饰的变量不可修改,final修饰的类不可扩展,final修饰的方法不可重写。

finally是保证重点代码一定要被执行到的机制。

finalize是Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收,已经不被推荐使用。推荐使用Cleaner机制:

public class CleaningExample implements AutoCloseable {
        // A cleaner, preferably one shared within a library
        private static final Cleaner cleaner = <cleaner>;
        static class State implements Runnable { 
            State(...) {
                // initialize State needed for cleaning action
            }
            public void run() {
                // cleanup action accessing State, executed at most once
            }
        }
        private final State;
        private final Cleaner.Cleanable cleanable
        public CleaningExample() {
            this.state = new State(...);
            this.cleanable = cleaner.register(this, state);
        }
        public void close() {
            cleanable.clean();
        }
    }

注意点:

final不是immutable,java语言没有原生的不可变支持,如果要实现immutable的类,需要做到:

  • 将class自身声明为final,这样就不能通过扩展来绕过;
  • 所有成员变量声明为private和final,不要实现setter;
  • 构造对象时,成员变量使用深拷贝,而不是直接赋值,确保输入对象不被其他人修改;
  • 如果需要实现getter,或者其他可能返回内部状态的方法,使用copy-on-write。
comments powered by Disqus