黑马程序员技术交流社区

标题: 关于单例的(饿汉式)??? [打印本页]

作者: --_.Is’攸稀    时间: 2013-12-9 13:42
标题: 关于单例的(饿汉式)???
本帖最后由 --_.Is’攸稀 于 2013-12-9 15:11 编辑

  1. public class Singleton1
  2. {
  3.      private Singleton1() {}
  4.      private static final Singleton1 single = new Singleton1();
  5.      public static Singleton1 getInstance()
  6.     {
  7.              return single;
  8.        }
  9. }
复制代码

今天重温了下单例--饿汉式,有些不理解为什么这里要把成员single用final修饰,如果是安全起见让它改变不了,private私有化就得了,就访问不了了。还有为什么要那也要static静态修饰?
作者: ┾——黑马    时间: 2013-12-9 13:51
首先你已经将构造函数私有化了,只有对外提供一个可以得到这个类的实例对象的静态方法,而静态方法需要访问你所定义的single ,所以single 需要被静态修饰,私有化是为了外界不能直接访问,final是表示这是一个常量,不能再对其赋值了,保证对象实例唯一性。所以这样定义是必不可少的
作者: ixiangfeng    时间: 2013-12-9 14:08
static修饰这是必须的 不然编译不过 因为其被公共方法调用,而final则不是必须的 不写结果也一样,只是为了让代码更严谨些吧 说明它是一个常量,一眼看出它终生只有一个量 仅此而已 不写也没人会说你错的
作者: 想你的夜    时间: 2013-12-9 14:13
首选,定义为final的确是安全起见让它改变不了,也保证其唯一性。
其次:你先复习下static的作用吧
static作用:如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象,也就是达到,饿汉式的要求。你可以将方法和变量都声明为static,static成员的最常见的例子是main( ) ,因为在程序开始执行时必须调用main() ,所以它被声明为static,这样你理解了吧
作者: --_.Is’攸稀    时间: 2013-12-9 14:14
┾——黑马 发表于 2013-12-9 13:51
首先你已经将构造函数私有化了,只有对外提供一个可以得到这个类的实例对象的静态方法,而静态方法需要访问 ...

哦,想起了静态方法只能访问类中的静态成员变量了,感觉没有final也可以,反正都不能被访问就不会被改掉。
作者: ┾——黑马    时间: 2013-12-9 14:34
--_.Is’攸稀 发表于 2013-12-9 14:14
哦,想起了静态方法只能访问类中的静态成员变量了,感觉没有final也可以,反正都不能被访问就不会被改掉 ...

但是这样考虑更严谨啊,有时候前辈们这样做还是有他们的道理的...嘿嘿




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2