`
TonyLian
  • 浏览: 396573 次
  • 性别: 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  
,那就是如果某些操作不依赖具体实例,那它就是静态的,反之如果某些操作是依赖具体实例的(例如访问一个特定会员的名称),那它就应该是实例化的。

相关推荐

    aspx转化为html(伪静态)

    从提高网站的访问速度和搜索引擎的收录考虑,有时候我们需要把动态的aspx转换为静态的html,这种转换分为两种:伪静态和真静态!这两种各有优劣,今天先不考虑这个,讲讲伪静态是怎么完成的.

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

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

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

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

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

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

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

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

    PC-Lint静态代码检测工具

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

    Nginx 过滤静态资源文件的访问日志的实现

    日常使用的 Nginx 大都既做静态资源服务器,也做反向代理服务器,尤其有些时候考虑到跨域问题,会对静态资源和后端接口使用同一个监听端口,如果不做一下过滤处理,会在 access_log 中看到大量的例如 js、css、jpg ...

    PHP伪静态写法附代码

    比如这个网页 https://www.jb51.net/soft.php/1,100,8630.html 其实处理的脚本是soft.php 参数为1,100,8630 相当于...URL重写是最好的方法(个人观点,大流量的时候可以考虑负载均衡了。同样没有关系) 附URL重写的

    C++面试题,针对资深开发工程师面试题目含详细解答

    13 什么时候使用对象指针,什么时候使用对象本身? 14 在C++中,构造函数是否可以是虚函数?为什么? 15 指针和引用的区别是什么? 16 请描述C++程序的内存分区? 17 什么时候必须使用初始化列表?使用初始化列表有...

    PC-lint (静态代码检测工具)

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

    osgearth+vpb

    算是动态和静态方法的结合吧,但是整个制作的过程中很顺利,貌似是没有问题的,但是当使用earth中的EarthManipulator时会发现一些莫名其妙的问题,最致命的问题是:当使用结点跟踪的时候会发现静态地形的LOD不会跟着...

    JavaScript面向对象之静态与非静态类

    使用JavaScript面向对象完全出于偶然,因为大部分时间我都是在无图形界面的环境下工作,有时候就算是介入了web客户端的工作的时候,在写js和ajax时,最多的也只是写写function,从没有考虑过要使用JavaScript面向...

    php生成静态页面并实现预览功能

    有些页面考虑到访问量比较大,页面结构又不常改动的,比如新闻公告等,可以考虑做成静态页面放在服务器上,这样第一是能抗住大流量的访问,第二也是更加安全一些,打开速度上有保证。 二、正文 1、什么是静态化 就...

    JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    1.Object类 ...我们想在程序中得到一个对象变量,只要能存储大量数据即可,这个时候,我们可以考虑使用Object类。Object类避免了对构造器的定义。 Object类下另一个常用的属性:hasOwnProperty var p

    Tomcat集群案例

    工作时间也不久了、所以不能只局限于完成现有...该实现序列化的要实现,单例模式、静态变量、线程同步、定时器重复执行,缓存增删更新通知问题、使用的时候就需要慎重考虑,否则到了从单机到集群的时候将会非常痛苦。

    纯js和css实现渐变色包括静态渐变和动态渐变

    当我开始搜索查找这个名词的时候,才发现它实际上是有两种理解或者说是两种形式的:动态渐变和静态渐变。 所谓动态渐变,举个简单的例子:他来了,她的脸渐渐红了…渐渐的,渐渐改变的,是不断在改变的;而静态渐变...

    Convert.cs

    在多年项目开发中经过不断更新,遇到的bug也都修正,写程序的时候会非常方便快捷,而且会减少大量不必要的条件判断避免出错。尤其一些常用转换可以不考虑数据类型直接操作而不出错。可以在项目中直接引用,都是静态...

    自己写的dll的简介

    1. 如果你只用C语言,那么必然以C文件创建DLL(自动编出C符号名),考虑到潜在的C++用户(此类用户多以静态调用方式使用DLL,因而需要看到其函数声明),我们还需要使用EXTERN_C关键字(详见上面的讨论)。...

    java7hashmap源码-Effective-Java-3th:Effective-Java-3th

    考虑使用静态工厂方法代替构造方法 优点: 有名字 每次调用的时候,不一定要创建新的对象 可以返回一个类型的子类型 Collections就是这种用法 返回对象的类可以随调用的不同而变化(用输入的参数值决定返回哪个),如...

    findbug 常见异常处理

    描述:调用的方法中不会抛出异常,但是调用方法的时候尝试使用try catch 捕获异常; 处理方式:确认此方法的调用会不会导致异常的发生,如果不会抛出异常请去 掉try catch,确认方法调用会不会抛出异常关键是对方法...

Global site tag (gtag.js) - Google Analytics