`
TonyLian
  • 浏览: 401596 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

什么时候考虑使用静态

阅读更多

用百度搜索“什么时候使用静态”,会得到大致这些结果:

 

  • 静态方法不用new对象可以直接调用
  • 1.与类相关与对象无关
    2.不需要对象的“轻”方法
    3.工厂方法
  • 如果某个方法是用频率较高,或者方法本身通用性较强,无需初始化类成员变量,则可以使用静态方法,那样方便,速度也快.
  • 可以直接拿来就用的方法,就算是静态的.
  • 肯定不涉及具体对象,因为静态方法内,是无法直接使用任何非静态成员的。
  • (1)制作工具类
    (2)可以当作"作局"对象或方法来使用
  • (1)重载"操作符"
    (2)C#3.0中的扩展方法(配合C#4.0的扩展事件,引领C#向"动态语言"的方向发展)
  • 静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
  • 静态方法不用创建实例就可调用,比较简单从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象  反之使用静态方法。
  • 我是把静态类当做全局变量和全局函数的整合对象来用的
  • 全局累加时用
  • 不需要生成对象的
    经常频繁使用的
    工具类里的(如SqlHelper)
  • 适当地使用static方法本身并没有什么,当一个人从来不懂使用多态、接口设计时,很自然地会滥用static方法。
  • 个人理解在多个类中需要调用并且是与对象无关的方法可设为静态方法,方便调用。
  • 所有对象共有的方法
  • 再不关系到任何于特定对象相关的操作
    比如学生的年龄就是学生的相关。
    修改学生的年龄就不适合用静态方法。
    一般来说,如果你的方法里没有用到this关键字,
    那就适合用静态方法
  • 通常通用的类中一些常用的方法可以设计为静态类
  • 只要是没有用到类的状态信息,只从参数获取信息的都可以为静态的
  • 可以实现某些特殊的设计模式:如Singleton
  • 由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部
  • 可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好
  • 总之,从OOA/OOD的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的
  • 静态方法与非静态方法最明显的区别就是如果某个方法是公共静态的,那么可以直接通过类名.方法名的方法来调用,而公共实例方法则需要事先实例化对象,然后才能调用。

这些各种说法,基本上都是正确的。但是,其中绝大多数是讲了“静态”和“实例”的区别,以及静态方法的特征。

很少有说到何时或是为什么要使用静态的。

 

静态包括静态类和静态成员(静态方法 和 静态属性),既然搜索出来的这些说的都是静态成员(基本上说的都是静态方法),那么我也就先仅对静态方法谈一谈自己的看法。

 

上中学数学,尤其是平面几何的时候,老师经常讲“定义”与“性质”的区别。“性质”只是它表现出来的特征而已,而“定义”才是真正的决定性的东西。

 

我觉得,静态方法的“定义”当然是 static 关键字了。没有用到this指针,这一点才是静态方法的首要“性质”(本质特征)。像什么【共通】【全局】【单例模式】呀,那都是它的应用场景,或是说使用静态方法来达到的目的。

 

那么说到“何时该使用静态方法”其实是困扰很多程序员的苦恼问题。不明白这一点,也从一个侧面反映出对OO思想的理解不够,就很可能通过滥用静态方法已达到在面向对象的语言中继续进行面向过程的编程这是很可怕的。

 

其实,方法是否涉及具体类的实例,或者简单的说是否涉及“数据”(如果使用就要用到this指针)是决定是否使用静态方法的根部要因。然而,判断是否涉及到“数据”也是要看当前设计思路的。有时候不够OO的设计,可能会将本该设计到数据的实例方法,从“数据相关”变成“数据无关”。(与OO不同,面向过程的编程就是将 方法 与 数据 分开)在这样的设计思路下,你会发现怎么什么动作都是与数据无关的呢?恩,这就该开始滥用静态方法了。

 

本想举一个好一点的例子,但是时间匆忙,就简短说一下 Log 吧。有人认为写日志是一个工具在干活,应该是 Log.debug(...);

有人认为,日志记录器是个“小精灵”应该有血有肉, Log logger = new Log();   logger.debug(...);

可能你会认为,这要取决于Log类以及debug方法的复杂程度;

也许你会认为,这要看Log类中是否有“数据”,比如,输出Level;

也许还有其他理由。

而我觉得可以说是仁者见仁智者见智,也可以看做是不同的编程风格,也可以... 总之,需要细细体会了。

 

追加一个稍好一些的例子:检查 TextBox 是否输入了数据,如果没有,则依据某一个ID,从配置文件中读取一句话(错误信息),然后弹出,并将此 TextBox 的底色置成红色,再将焦点放到上面去。

 

如果你不希望这一系列的操作(大概6-7行代码)每次都要写一遍,你就会设法把它提炼为“共通”。

 

方法一:(静态)

public class Checker
{
    public static void CheckEmpty(TextBox textBox)
    {
        if (textBox.Text.Length == 0)
        {
            string msg = Properties.ReadMessage("001");
            MessageBox.Show(msg);
            textBox.BackColor = Color.Read;
            textBox.Focus();
        }
    }
}

    Checker.CheckEmpty(textBox1);

 

 

方法二:(实例)

public class MyTextBox : TextBox
{
    public void CheckEmpty()
    {
        if (this.Text.Length == 0)
        {
            string msg = Properties.ReadMessage("001");
            MessageBox.Show(msg);
            this.BackColor = Color.Read;
            this.Focus();
        }
    }
}


    MyTextBox textBox1 = new MyTextBox();
   ........ 
   textBox1.CheckEmpty();

 

因为Swing使用的很少,所以就用WinForm的控件来举例子了,所以代码是C#的,其实没有关系,所有OO语言在这一点上都是一样的。

 

如果你不觉得【扩展】SDK的控件有多么恐怖,或者应为其他原因已经对其扩展了,那么我更推荐使用实例方法(方法二)。理由吗,对控件的检查本来就是和控件自身(Text属性)息息相关的,是活生生的。

(这里不讨论读配置文件、MessageBox 等操作是否违背开闭原则)

 

欢迎大家拍砖讨论。

 

5
1
分享到:
评论
1 楼 phenix_mj 2011-04-18  
,那就是如果某些操作不依赖具体实例,那它就是静态的,反之如果某些操作是依赖具体实例的(例如访问一个特定会员的名称),那它就应该是实例化的。

相关推荐

    利用静态变量对函数访问次数计数.zip

    因此,在实际应用中,应当谨慎使用静态变量,并在不需要时考虑手动清除。 总结,利用静态变量对函数访问次数计数是一种简单而有效的方法,尤其适用于简单的计数需求。但在多线程和内存管理方面,需要额外的注意和...

    大型站点网站静态化实现方案

    此外,可能还会配置HTTP模块或处理程序,以便在适当的时候触发静态化过程。 4. **编译和部署**: 文件夹`Bin`通常包含应用程序的编译后的DLL文件和其他依赖库。在静态化实现中,这些DLL可能包含了实现静态化的关键...

    asp生成静态页面代码

    然而,有时候我们需要将ASP动态页面转换为静态HTML页面,以便更好地优化SEO或提升用户体验。下面,我们将深入探讨如何使用ASP来生成静态页面的代码实现。 首先,我们需要理解ASP生成静态页面的基本步骤: 1. **...

    静态路由表配置, 很详细啊

    - 当动态路由协议不适合或者不必要的时候,例如,安全或性能考虑。 然而,静态路由也有其局限性,如网络扩展时需要手动更新,可能导致配置错误和管理负担增加。因此,对于大规模和复杂网络,通常会采用动态路由协议...

    express入门(3)-静态文件

    本文将详细介绍如何在Express应用中配置和使用静态文件。 #### 二、静态文件概述 在Web开发中,“静态文件”通常指的是那些不经过服务器端处理直接发送给客户端的文件,包括但不限于HTML、CSS、JavaScript文件、...

    浅谈Android中关于静态变量(static)的使用问题

    这意味着静态变量的值在进程被杀死后无法保证,开发者应考虑将重要数据持久化到外部存储,如NAND或SD卡,以便在进程重启时恢复。 第四,Application类作为全局单例对象,其生命周期与进程相同。当进程被杀死,...

    静态电流应用电路图分析

    输出升压电感是升压转换器中的关键组件之一,它主要用于存储能量并在适当的时候释放这些能量,以提高输出电压。在升压转换器中,当功率开关管导通时,电感开始存储能量;当功率开关管关断时,电感将储存的能量释放到...

    静态代码检查工具 PC-LINT以及sourceinsight中配置

    PC-Lint是一个历史悠久,功能...我个人觉得,对于小公司和个人开发而言,PC-Lint也非常重要,因为基于开发成本考虑,小公司和个人往往不能拿出很多很全面的测试,这时候,PC-Lint的强劲功能可以很好地提高软件的质量。

    vc++实现“静态”的位图动画源程序

    7. 在适当的时候,使用`KillTimer()`函数停止定时器。 此外,为了使动画“静态”,我们需要确保位图在显示时不会移动或变形。这意味着动画效果仅限于帧之间内容的变化,而背景或框架应保持不变。 在实际编程中,你...

    Java面向对象之静态.doc

    - 在实际应用中,如果发现工具类的方法都不依赖于对象状态,可以考虑将这些方法声明为静态。 - 示例代码: ```java class ArrayTool { public static int getMax(int[] arr) { // 实现获取数组最大值的逻辑 ...

    静态网页模版

    4. **响应式设计**:考虑到现代网页需要适应各种设备的屏幕尺寸,“都市生活”模板很可能采用了响应式设计。通过使用媒体查询(Media Queries)和百分比布局,确保页面在手机、平板电脑和桌面电脑上都能良好展示。 ...

    winform嵌套html静态网页+软键盘+弹出框

    在本文中,我们将深入探讨如何在WinForm应用中嵌套HTML静态网页,并实现与后台的交互,以及如何设计和使用软键盘与弹出框。这些技术对于开发触控友好型的桌面应用程序尤其重要。 首先,让我们关注“WinForm嵌套HTML...

    QT静态单例管理信号和槽

    在Qt中,我们通常使用静态成员函数来实现单例,确保任何时候都只能通过这个函数创建或获取该类的实例。 创建Qt静态单例的典型步骤如下: 1. **定义类**:首先,创建一个类,例如`SingletonClass`,它继承自你想要...

    Linux动态库与静态库制作及使用详解

    3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题。本文这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介绍。  两个要知道的基本知识  Linux 应用程序...

    php 函数中静态变量使用的问题实例分析

    本文将深入探讨静态变量的概念、使用场景及其潜在问题,并通过实例来解析如何避免这些问题。 静态变量的主要特点是它们的生命周期跨越了函数调用的边界。在函数首次被调用时,静态变量会被初始化并赋值。之后,每当...

    Android中在xml中静态添加Fragment

    - 在使用`<fragment>`标签时,要考虑到Fragment的生命周期和Activity的生命周期是相互关联的,需要在适当的时候处理生命周期方法,如`onCreateView()`, `onStart()`, `onResume()`等。 四、实际应用 在实际项目中,...

    静态项目排期表plan.js.zip

    我在团队项目的时候,通常会建立一个静态的 html 文件制定项目计划,以便于更好的协作。考虑到项目的庞大,传统的 html 方式往往我们会让我们填的晕头转向,之前刚好接触过 Angular.js ,图个一劳永逸,写此模板。 ...

    ASP,NET源码——[新闻文章]生成静态新闻源码.zip

    3. 动态转静态:ASP.NET 提供了内置的HttpHandler或HttpModule机制,可以捕获HTTP请求,并在适当的时候生成静态HTML文件。当用户访问新闻文章时,如果对应的HTML文件不存在,源码会动态生成;如果已经存在,则直接...

    JSP页面的静态包含和动态包含使用方法

    在选择包含方式时,也需要考虑到请求转发过程和request对象的使用。不论是静态包含还是动态包含,它们都使用同一个request对象,因此,尽管最终编译成的Servlet数量不同,但它们组合过程是一个请求转发的过程,共享...

    Aspx伪静态 虚拟主机案例及服务器案例.doc

    我现在这个业余码农以前由于管理系统做多了从来也不考虑静态化的问题,但是现在要负责一批商业网站的seo事务,伪静态就成了工作重点。 以前没有系统的研究过伪静态,这次用了几天时间好好的研究了一下,中间也走...

Global site tag (gtag.js) - Google Analytics