开发者社区> 问答> 正文

这段代码报错的原因是为什么 ,为啥要加static?报错

//懒汉式单例类.在第一次调用的时候实例化  public class Singleton2 {

    //私有的默认构造子  
	private Singleton2(){}
    
    //注意,这里没有final      
   public static Singleton2 sing=null;
    
    //静态工厂方法   
   public static synchronized Singleton2 singleton2(){
	 if(sing == null)  
	   sing=new Singleton2();
	 
	   return sing;
   }
   
   public  class Singleton1{
	 private Singleton1(){}
	 
	 public  static Singleton1 sing2=new Singleton1();
	 
	 public static Singleton1 getInstance(){
		 return sing2;
	 }
	   
   }
}</pre> 



展开
收起
爱吃鱼的程序员 2020-06-14 15:56:40 623 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    首先静态方法不能使用非静态变量

    你Singleton1是一个内部类,编译器的提示是内部类中声明静态变量必须这个类也得有static修饰。

    其实想想静态资源加载过程就能想通这点。静态资源在程序启动时初始化,非静态资源在运行时初始化。

    把内部类的public去了吧,static变量会一直存在,

    忘了懒汉和饿汉的实现方式吧,可以使用懒加载初始化的方法来解决单例的需求。

    http://en.wikipedia.org/wiki/Singleton_pattern#Lazy_initialization

    示例:


    publicclassMemoryFactory{privateMemoryFactory(){}privatestaticclassSingletonHolder{publicstaticfinalMemoryMEMORY=newMemory(getDataSource());//publicstaticfinalMemoryMEMORY=newMemory(newSimpleDataSource());}publicstaticMemorygetInstance(){returnSingletonHolder.MEMORY;}publicstaticfinalDataSourcegetDataSource(){try{Contextcontext=newInitialContext();return(DataSource)context.lookup("java:comp/env/jdbc/test");}catch(NamingExceptione){thrownewRuntimeException(e);}}}


    2020-06-14 15:56:56
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载