慎用静态类static class

偶然翻到一篇有趣的帖子:

class - When to Use Static Classes in C# - Stack Overflow
http://stackoverflow.com/questions/241339/when-to-use-static-classes-in-c-sharp

觉得说的挺有道理,很多项目都会有一个静态的utility类,但如果预期系统会变得非常复杂,且现有方法未来会出现多种实现,请谨慎使用这样的静态类。主要原因:

  1. 无法使用多态,如果需要对某一方法的实现做一小小改动,会很难看。
  2. 参数爆炸。随着方法在不同的场合被使用,需要的参数种类会越来越多,出现越来越多的重载。虽然可以使用optional parameter,但如果增加一个新的必选参数,则这个参数必须跟在已有必选参数后面,从而改变已有调用的参数顺序,造成混乱。如果是非静态类可以考虑把可选参数都做成构造函数的参数。
  3. 无法使用接口,造成编写单元测试困难。
时间: 2024-12-15 01:35:25

慎用静态类static class的相关文章

static inner class 什么时候被加载

一直认为在加载outer class 的同时也会加载inner class 并且完成静态变量和代码块的初始化,今天在维基百科上面看到 "The static class definitionLazyHolder within it is not initialized until the JVM determines that LazyHolder must be executed",颠覆了我之前的观点,于是做下列实验来证明一下: public class Initialize { /

理解 static (深入了解JAVA虚拟机)

谈谈我对static的理解 by~~~~~~~~~~~~~~~~~~渣渣飞(偷偷用我纸抽的小腿打骨折~啦啦啦~) 因为我发现很多同学学到这里都会很困惑 很难理解static到底是个什么 首先 static是个修饰符 被static修饰的变量我们统称为静态变量也叫类变量(为什么叫类变量呢 ?因为我们可以直接使用类来调用被static修饰的变量) static 不可以修饰局部变量!牢记 再和大家说一下另一种变量 也同样是成员变量 叫但是没有被static修饰 我们叫它全局变量也是很多人嘴里的动态变量

C#的静态类

静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类:其次,它防止在类的内部声明任何实例字段或方法. 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明.程序员必须声明一个私有构造器.私有构造器禁止开发者在类的范围之外实例化类的实例.使用私有构造器的效果与使用静态类的效果非常相似.两者的区别在于,私有构造器方式仍然可以从类的内部对

静态、抽象类、加载类、魔术方法等

静态  static关键字 普通成员普通成员是属于对象的 静态成员静态成员是属于类的 普通方法里面可以调用静态成员静态方法里面不能调用普通成员self关键字 在类里面代表该类 普通类 class Ren { public $name="张三"; public static $zhongzu; //静态成员 普通方法 function Say() { echo self::$zhongzu."你好"; } 静态类 static function Run() { ech

深入理解ThreadLocal

ThreadLocal是一个和线程安全相关的类. 一个非线程安全的例子 在我们讲述它之前,我们先看一个例子. package thread; public class NotSafeThread implements Runnable{ private int a=10; public void run() { // TODO Auto-generated method stub for (int i = 0; i < 5; i++) { try { if (Thread.currentThre

类和接口的区别

类: 类的分类有:抽象类(abstract).密封类(sealed).静态类(static) 抽象类(abstract) 关键字: abstract使用目的:若所有子类拥有共同的特性,可以把这个特性放到一个抽象类中,子类继承此抽象类. 特点: 1.不能被实例化:ClassName en=new ClassName();//这样会报错. 2.抽象成员必须包含在抽象类中. 3.抽象类除了抽象成员外,还可以包含别的成员(不用关键字 abstract). 4.子类继承抽象父类后,必须把父类中的所有抽象成

C#语法复习3

第七章 类与继承 1.虽然派生类不能删除基类的的任何成员,但我们可以利用在派生类当中声明与基类成员名称相同的成员来屏蔽基类成员.这叫 覆盖. 一种是隐式屏蔽.一种是显式屏蔽.所谓 显式就是 加上一个new 关键字即可.此new 可以放在字段前面,也可以放在方法前面. 此时,如果我们还是想访问基类成员,可以使用基类访问方式实现.base. Xxxx 来实现 访问隐藏的继承成员. 2.虚方法与覆写方法 这部分内容和C++里面的 虚函数与抽象类类似,而含有纯虚函数的类属于抽象类. 这里面有个神奇的地方

ListView的item选中效果

有时app会需要点击某个item并实现选中的效果,例如做pad时用Fragment实现的左侧列表右侧内容的效果,点击左侧某一个item后会高亮选中 有时简单的使用setSelected(boolean b)或setSelection(int position)会不成功,需要重写Adapter,并在getView中进行处理 package com.example.selectitemtest; import java.util.ArrayList; import java.util.HashMap

C#扩展方法

由于业务的需求,可能系统提供的方法并不能帮助我们完成相应的功能, 此时就可以扩展系统类的方法. 扩展方法本质是静态方法,只是C#提供了便利,扩展内部不能调用被扩展类的私有.protected的成员. 在下述的代码中也可以看见,静态类myExtend就是为扩展string类方法使用的. 写扩展方法有三个步骤: 1.声明一个类为静态类static,这里也增添类的访问修饰符public公用的,这样才能被调用. 2.声明一个静态方法 3.参数的写法,格式为 this 扩展类名 参数 形参1 形参2...