静态代码块和单例混合

Posted 命运的绯色结局

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态代码块和单例混合相关的知识,希望对你有一定的参考价值。

使用单例是为了像一些工具,不用去重复的new,而静态代码块,可以在类加载的时候就执行。

static块的执行发生在“初始化”的阶段。

public class T4 {
    
    static {
        //静态代码块
        System.out.println("Tom");
        
    }

    public static void hahah (){
        System.out.println("123");
        
    }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            //T4.hahah();
            
        }

}

可以看出,控制台这里已经输出了

Tom

换一种玩法:

public class T4 {
    
     public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            //T4.hahah();
            
            //MongoDbUntil.getDateName();
            
            //MongoDbUntil.getDateName();
        }

}
 class T5{
    
    
    static {
        //静态代码块
        System.out.println("Tom");
        
    }

    public static void hahah (){
        System.out.println("123");
        
    }
    
}

这里发现,就不会进行输出,也就是说,是从类被状态,或者说被调动的时候,才会触发这个静态代码块。

那这里就刚好可以和单例配合起来使用。

下面就用我的mongo的工具栏来展示吧。

package com.sun.util;

import java.util.ArrayList;
import java.util.List;

import org.bson.Document;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

/**
 * @author  szy 
 * @version 创建时间:2018-5-5 下午12:07:17
 * 
 */
public class MongoDbUntil {

    private static String databaseName;
    private static  MongoClient mongoClientInstance;
    private static  MongoDatabase database;
    
    
    static{
        
       //库名
        databaseName = "test";
        
        try {
            mongoClientInstance = getInstance();
            
            database = mongoClientInstance.getDatabase(databaseName);
            
            System.out.println("MongoDatabase-1 inof is : "+database.getName());
            
             //表里表里的集合
            for (String name : database.listCollectionNames()) {
                System.out.println("test表里的集合有:"+name);
            }
            
            System.out.println("Connect to database successfully!");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
         
    }
        
    
    private static MongoClient getInstance(){
        
        if(mongoClientInstance == null){
            mongoClientInstance  = new MongoClient("localhost", 27017);
        }
        return mongoClientInstance;
    }
    
    
    public static String getDateName(){
        
        database = mongoClientInstance.getDatabase(databaseName);
        
        System.out.println("MongoDatabase-2 inof is : "+database.getName());
        
        return null;
        
    }
    
    /**
     * 插入一条mongo记录
     * @param coll
     */
    public static void InsertMongoDataByOne(String CollName){
        
           //获得一个集合对象 
        MongoCollection<Document> coll = database.getCollection(CollName);
        
           //如果在集合中插入相同的_id,会报错  index: _id_ dup key: {
        Document document = new Document("_id", 2002).append("title", "MongoDB Insert Demo")
                .append("description","database")
                .append("likes", 30)
                .append("by", "yiibai point")
                .append("url", "http://www.yiibai.com/mongodb/");

        //再插入一条不指定id的,会自动分配一个_id
        Document document2 = new Document("title", "MongoDB Insert Demo")
                .append("description","database")
                .append("likes", 30)
                .append("by", "yiibai point")
                .append("url", "http://www.yiibai.com/mongodb/");
        coll.insertOne(document2);
        
        //往集合对插入一体爱记录
        coll.insertOne(document);
    }
    

    /**
     * 多行插入
     * @param coll
     */
   public static void InsertMongoDataByList(String CollName){
       
       //获得一个集合对象 
        MongoCollection<Document> coll = database.getCollection(CollName);
       //多行插入
        List<Document> documents = new ArrayList<Document>();
        Document a1 = new Document("title", "2018");
        
        Document a2 = new Document("title", "2019");
              
        documents.add(a1);
        documents.add(a2);
        
        coll.insertMany(documents);
        System.out.println("Document inserted successfully");
       
   }
    
    
}

可以发现,静态代码块只会进入一次,而刚好那时候被初始化了。

以上是关于静态代码块和单例混合的主要内容,如果未能解决你的问题,请参考以下文章

简单多线程和单例学习例一

静态类和单例模式区别

java 静态方法和单例模式的区别

静态构造函数和单例模式

R闪亮:如何将滑块和单选按钮链接到ggplot

变量静态的和单例模式