常在论坛上看见一些有关单例模式、静态类、静态方法缺点的讨论,说得最多的无非是使用static,破坏了面向对象的多态性,建议除非确定了该对象不会被扩展,否则不要使用单例模式、静态方法等。其中,举例最多的是:
辅助类可采用单例、静态方法。
确实,我在开发中,看见的基本都是如此。但我一直有点疑问,今天在这提出,希望JE上兄弟讨论下:
辅助类使用静态方法就一定好吗?我
觉得可能也会存在如下问题:
1.如果类中属性或方法是static的,那么在该类被装载到方法区时,是要分配内存的。那如果是static的,是不是表示该类(非对象)永远不会被垃圾收集了呢?从而占用一定的内存空间,如果这样的类多的话,那JVM的可使用内存不是会很少?既然这样,又何必用静态方法呢?(
我不太确定含有静态字段或方法的类是否会被垃圾收集器收集)
2. 问题1一出现,则会衍生出问题2来,即由于加载到方法区中的类型都保持着一个对加载该类的类加载器的引用,既然类不能被垃圾收集,从而则一定会造成其对应的类加载器也不会被垃圾收集,这样,又会出现许多类加载不能被垃圾收集,不是更占有JVM内存空间了吗?
(
由于Java的安全性特点,加载不同包下的类的加载器一定不会是同一个对象吧。这个我不确定)。
基于以上问题,希望JE兄弟赏脸,讨论下。
先贴出我的观点:辅助类采用单例或静态天方法也不一定是最完美的。使用单例、静态的目的就是为了节省JVM内存,如果一个辅助类用的概率不是特别大,难道还应该向大部分人建议那样使用单例或静态吗?不应该了吧。
分享到:
相关推荐
在Java或C#等面向对象的语言中,单例模式通常通过私有构造函数和静态工厂方法来实现。例如,我们可以创建一个名为`Singleton`的类,其构造函数为私有,然后定义一个静态方法`getInstance()`用于返回唯一的实例。这样...
1. 定义一个接口,声明一个静态实例变量和一个类方法来获取该实例。 ```objc @interface Singleton : NSObject + (instancetype)sharedInstance; @end ``` 2. 在实现文件中,我们使用`@synchronized`关键字确保...
在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...
在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、精确的时间戳以及可变长参数和标准格式化输出的功能。 首先,让我们深入了解单例模式。单例模式的主要...
首先,让我们深入理解单例模式。在C#中,我们可以使用静态成员或双重检查锁定(Double-Check Locking)来实现单例。静态成员方法是最简单的实现方式,但可能会在多线程环境下引发问题。因此,更安全的方法是使用双重...
本文将深入探讨基于Qt的日志单例的设计与实现。 首先,让我们理解什么是单例模式。单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。这样可以避免资源浪费,特别是对于日志系统这种在整个...
本篇将通过两个实例——静态成员函数和静态数据成员,深入探讨它们在C++中的应用。 首先,我们来看静态成员函数。在C++中,静态成员函数可以被类的所有对象共享,它并不持有隐含的`this`指针,因此不能访问非静态...
2. 单例类(CharacterSingleton):持有角色类的单例实例,提供静态方法供外部获取角色创建服务。 3. 初始化逻辑:在单例类中处理角色的初始化,如读取默认设置或从数据库加载信息。 4. 线程安全措施:如使用...
本篇文章将深入探讨如何对`Toast`进行基本封装,特别是实现单例化以及针对成功和失败场景的定制化提示。 首先,让我们理解`Toast`的基本用法。`Toast`类在`android.widget`包中,通过`makeText()`方法创建一个`...
Java 编程中,子类能否重写父类的静态方法是一个值得讨论的问题。通过实例探索,我们可以了解到父类的静态方法可以被子类继承,但是不能重写。 首先,我们来看一下父类的代码: ```java public class Fu { public ...
本篇文章将深入探讨如何在Swift中实现单例、代理和通知这三种常用的设计模式,并讲解如何在Swift与OC之间进行有效的混编,包括创建按钮和实现页面跳转。 首先,我们来看Swift中的单例设计模式。单例是一种确保类...
通过这些实验,学习者可以深入理解静态成员如何在类实例间共享数据,友元如何突破封装界限进行有效协作,以及类模板如何提高代码的重用性和灵活性。同时,实验还能帮助学习者巩固面向对象编程的基本原则,提升其编程...
其中,堆内存是Java对象的主要存储场所,栈内存主要存储方法调用时的局部变量,而方法区则存储类的信息,如类的常量池、字段和方法数据等。 内存泄漏通常发生在堆内存中,当程序创建对象并分配内存后,如果不再需要...
总之,"毕向东静态07"的Java基础教程深入浅出地讲解了面向对象设计中的重要一环——单例设计模式,特别是通过双重检查锁定实现的懒汉式单例,对于初学者和有一定经验的开发者来说,都是提升技能的重要学习材料。
文件"Real-Singleton-Approach-in-WPF-Application.pdf"可能包含了更深入的讨论,包括线程安全的单例实现(如双重检查锁定或使用`Lazy<T>`类型),以及在WPF环境中单例模式的特定应用场景和最佳实践。"下载链接.txt...
Java是世界上最流行的编程...以上只是Java面试中可能涉及的部分知识点,实际面试中可能会根据职位需求和技术栈深度进行更深入的讨论。通过准备这些知识点,候选人可以更好地应对Java相关的面试挑战,提升自己的竞争力。
实验报告的七页内容可能详细阐述了这些概念,通过实例代码和结果分析,帮助学习者深入理解静态成员和友元的作用,并掌握如何在实际编程中合理利用它们。遗憾的是,由于无法直接查看压缩包内的具体文件,我们无法提供...
在讨论双重检查锁定失效的原因之前,让我们先从单例模式的基本实现开始,逐步深入。最简单的单例模式实现方式是将构造函数设为私有,并在类内创建一个静态的类实例,同时提供一个公共的静态方法来获取这个实例。这种...
静态变量和静态方法在类的所有实例之间共享,它们不会随着实例的创建而复制。在TypeScript中,我们可以使用`static`关键字来声明静态成员。 1. 静态变量: 类中的静态变量可以在没有创建实例的情况下被访问。它们...
在Java中,通常通过私有构造器和静态工厂方法来实现单例,同时要防止反射和序列化破坏单例的唯一性。 其次,是**工厂方法模式**。它是一种创建型设计模式,提供了一种封装对象创建过程的方法,使得创建过程可以延迟...