首页 > 其他分享 >static vs Singleton,静态类vs单例模式之争

static vs Singleton,静态类vs单例模式之争

时间:2024-06-05 12:12:33浏览次数:30  
标签:Singleton 销毁 doSomething 接口 vs static 单例 Activity

https://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern?answertab=modifieddesc#tab-top

单例模式可以用接口, Singleton can implement interface

可以通过单例类来实现接口,但不能通过类的静态方法或者在某些语言(如C#)中的静态类来实现接口。这是因为接口是一种契约,它定义了一组方法的签名,而这些方法需要由实现接口的类的实例来实现。静态方法不属于任何实例,因此不能用来实现接口。
下面是一个Java的例子,展示了如何通过单例类来实现接口

interface MyInterface {
    void doSomething();
}

class Singleton implements MyInterface {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {	// 线程安全
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    @Override
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

在这个例子中,Singleton类实现了MyInterface接口,并且我们通过getInstance方法来获取Singleton的实例。这个实例可以调用doSomething方法,因为它是MyInterface接口的一部分。 然而,如果我们试图通过静态方法来实现接口,就会遇到问题。例如,下面的代码是无效的:

interface MyInterface {
    void doSomething();
}

class MyClass {
    public static void doSomething() {
        System.out.println("Doing something...");
    }
}

在这个例子中,MyClass的静态方法doSomething并没有实现MyInterface接口。这是因为静态方法不属于任何实例,而接口需要由实例来实现。因此,我们不能通过静态方法来实现接口。

java的GC内存回收

单例模式仅在需要使用的地方才开始初始化
使用单例模式,每次都得先获取实例:

Singleton myS = Singleton.getInstance();
myS.doSomething();

静态类从一开始就预分配在内存中

Singleton.doSomething();

看起来是更短了
但仅当方法很少、使用不多,才使用静态类,原因如下:

安卓的context变成无效引用

public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 必须先于binding初始化
        SharedPreferences.getInstance(this);

但如果安卓把mainActivity的内存释放了,此时this就是个NullReference的无效引用,导致app直接崩溃

因为它可能持有一个对MainActivity的引用(通过this关键字)。如果MainActivity被销毁,这个引用就会变得无效。为了避免这种情况,您应该确保SecurePreferences类不持有任何对Activity的引用,或者在Activity被销毁时正确地清理这些引用。

MainActivity何时销毁

在Android中,MainActivity或任何其他Activity可能会在以下情况下被销毁:

  • 当用户按下返回键或者调用finish()方法时,系统会销毁当前Activity。
  • 当系统内存不足,需要释放一些资源时,系统可能会销毁处于后台的Activity。
  • 当用户通过任务管理器关闭应用程序时,系统会销毁所有的Activity。
  • 当Activity的onDestroy()方法被调用时,Activity会被销毁。这通常发生在Activity生命周期结束时。
  • 当设备的屏幕方向改变(从竖屏变为横屏,或者反过来),并且Activity没有处理屏幕方向改变的事件时,系统会销毁并重新创建Activity。

请注意,即使Activity被销毁,应用程序进程可能仍然存在,除非系统需要释放资源,或者用户通过任务管理器关闭应用程序。

二者原本都不是线程安全

如果多线程同时获取实例,则二者都无法保证线程安全。在java中则需要synchronized关键字

标签:Singleton,销毁,doSomething,接口,vs,static,单例,Activity
From: https://www.cnblogs.com/nolca/p/18232734

相关文章

  • 【VS Code使用】仅当从 VS 开发人员命令提示符处运行 VS Code 时,cl.exe 生成和调试才
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、前言......
  • 【VMware vSphere】使用vSphere Lifecycle Manager(vLCM)管理独立主机和集群的生命周期
    vSphereLifecycleManager(vLCM)是vSphere7中引入的一项新功能,它提供了一种集中式、自动化和简单性的方式来管理和升级vSphere基础架构组件(如vCenter、ESXi主机和NSX)的生命周期。VMware早期用于vSphere升级和补丁管理的解决方案称为vSphereUpdateManager(VUM),这对管理员用......
  • 【转】[VS] 把.nuget文件夹从C盘移到其它盘
    转自:https://blog.csdn.net/Henry_Wu001/article/details/1358256991、用命令查看缓存文件夹的具体路径:dotnetnugetlocalsall--list会出现大概下面的结果: 其中“global-packages:”开头的这行就是这个缓存的位置。上面的图片中,我的是E盘,是因为我已经移动过了。你看到的......
  • ovs学习自用
    ovs框架 当前最新代码包主要包括以下模块和特性:ovs-vswitchd:主要模块,实现switch的daemon,包括一个支持流交换的Linux内核模块;ovsdb-server:轻量级数据库服务器,提供ovs-vswitchd获取配置信息,例如vlan、port等信息;ovs-brcompatd:让ovs-vswitch替换linuxbridge,包括获取bridge......
  • Linux运维应知必会的LVS高可用负载均衡方案
    背景在业务量达到一定量的时候,往往单机的服务是会出现瓶颈的。此时最常见的方式就是通过负载均衡来进行横向扩展。其中我们最常用的软件就是Nginx。通过其反向代理的能力能够轻松实现负载均衡,当有服务出现异常,也能够自动剔除。但是负载均衡服务自身也可能出现故障,因此需要引......
  • static和final关键字
    一.static关键字1.被static修饰的变量/方法属于类变量/方法,可以通过类名.变量/方法直接调用,不用new一个类出来原因:静态方法是与类相关联的,而不是与类的实例相关联的。静态方法被加载到内存中的类区域,并且在类加载的过程中就会被初始化,不需要等到创建类的实例时才初始化。因此......
  • vscode如何添加本地python解释器、解析器 Interpreter?(Python: Select Interpreter),并在
    先安装python扩展然后点ctrl+shift+p搜索python:select,选择解析器(或者也可以直接点左下方的) 然后360报毒了,允许通过,然后选择你想要的解释器  然后就好了20230816文章目录在VSCode中添加本地Python解释器 Python解释器简介为什么要在VSCode中设置Python解释器如......
  • VS Code自定义代码模板
    VSCode自定义代码模板VSCode作为一款轻量级的编辑器,使用体验极佳,具有很多有用的小功能,也有着非常丰富的插件,日常写代码的时候自动补全和各种模板能够有效的提高编码的效率,这里介绍两种我常使用的自定义代码块或者模板的设置方法。集成自定义代码段VSCode自带了用户定......
  • 前端工程化工具系列(六)—— VS Code(v1.89.1):强大的代码编辑器
    VSCode(VisualStudioCode)是一款由微软开发的强大且轻量级的代码编辑器,支持多种编程语言,并提供了丰富的扩展插件生态系统。这里主要介绍如何使用配置ESLint、Stylelint等插件来提升开发效率。1自动格式化代码最终要达到的效果是:在对文件保存时自动格式化Vue、JS/TS......
  • 文心一言 VS 讯飞星火 VS chatgpt (273)-- 算法导论20.2 8题
    八、假设设计了这样一个proto-vEB结构,其中每个簇数组仅有u14u^\frac{1}{......