工具类该用单例模式,还是用静态的方式

背景

工具类是我们开发中,常常用到的一个公共类。一想到工具类,因为可以直接类.方法调用,大家就会想到静态的声明这个方法。不用实例化,直接使用。

那我为何会有标题所提这样一个疑问呢?

静态的声明会在程序一加载的时候就分配一个空间在,类似于一打开程序就实例化了。它会一直存在,直到程序被销毁。若是static使用不当,就很有可能出现内存泄漏的问题。

解决

经过我查阅网上的资料结合自己的理解,我总结出:其实单例模式的方式和静态的方式是可以共存的。

 

单例模式工具类应用场景1:

这一种场景就比较容易想到,比如,这个工具类中的成员变量需要有且只有同一个的时候。比如DialogUtils、DateUtils……

 

单例模式工具类应用场景2:

应用于一些方法中会改变传过来的对象的值。我们叫做引用了外部对象。比如我传一个List对象给你,你可以get它里面的item,但是你却要往List对象里面set入一些值;我传一个View给你,你可以get这个View的某些属性值,但你却往View里面set东西。

总之,就是我传给你的参数对象我后面还要用的,而在经过你这个方法过后我这个对象会被你改变值的,就用单例模式工具类,写法如下:

/**
 * @author xaeHu
 * 单例模式工具类:含有外部引用对象的公共方法写到这里
 */
public class ActivityUtils {
    private static ActivityUtils utils;
    public static ActivityUtils getInstance(){
        if(null == utils){
            synchronized (ActivityUtils.class){
                if(null == utils){
                    utils = new ActivityUtils();
                }
            }
        }
        return utils;
    }

    /**
     * 适配器绑定纵向列表控件
     * @param adapter 适配器
     * @param recyclerView 列表控件
     */
    public void bindToRecyclerView(BaseQuickAdapter adapter, RecyclerView recyclerView){
        recyclerView.setLayoutManager(new LinearLayoutManager(App.getContext()));
        adapter.bindToRecyclerView(recyclerView);
    }


}

使用:

ActivityUtils.getInstance().bindToRecyclerView(adapter,recyclerView);

Emmm……这个App.getContext()是我声明的一个静态的全局可用的ApplicationContext,这个跟本篇文章无关,不过也可以列出来学习交流一下:

//别忘了在AndroidManifest.xml中修改Application的name属性为此类
public class App extends Application {
    private static Context context;
    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext(){
        return context;
    }
}

 

而静态工具类应用场景:

这个就简单啦,过去的数据只是给你用的,你爱怎么处理怎么处理的时候。比如,上面说提,传一个list给你你只是get它的item的值;或者是直接传数据类型的时候。

/**
* @author xaeHu
* 静态模式工具类:不含外部引用对象的公共方法写到这里
*/
public class StaticUtils {

    /**
     * 打印日志
     * @param msg 日志内容
     */
    public static void log(String msg){
        if(BuildConfig.DEBUG){
            Log.i("myout", "---myout---------------------------------------------------");
            Log.i("myout", "|\t\t"+msg);
            Log.i("myout", "-----------------------------------------------------------");
        }
    }

    /**
     * 秒转换分钟
     * @param s 秒
     * @return 分钟字符串
     */
    public static String sToMin(int s){
        return msToMin(s*1000);
    }

    /**
     * 格式化方式让long毫秒转分钟字符串
     * @return xx:xx
     */
    public static String msToMin(long times){
        Date dates = new Date(times);
        SimpleDateFormat sdf = new SimpleDateFormat("mm:ss", Locale.getDefault());
        return sdf.format(dates);
    }

    /**
     * 复制到剪贴板
     * @param text
     */
    public static void copyText(String  text){
        ClipboardManager clipboardManager = (ClipboardManager) App.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
        //创建ClipData对象
        ClipData clipData = ClipData.newPlainText("MyClip", text);
        //添加ClipData对象到剪切板中
        clipboardManager.setPrimaryClip(clipData);
    }
}

 

完。

转载请注明出处:https://blog.csdn.net/qq_35584878/article/details/91438648

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值