我一直使用单例类和静态方法,但总是想过如果有一个独立的类型是静态类型且不能实例化,只有静态方法该多好啊!
这样做可以提高可读性和易于维护。
例如:
public UtilType MyUtility
{
public void Calculate(int x,int y)
{
return x+y;
}
}
MyUtility
不应该允许被实例化,只能以静态方式访问它的方法。
我一直使用单例类和静态方法,但总是想过如果有一个独立的类型是静态类型且不能实例化,只有静态方法该多好啊!
这样做可以提高可读性和易于维护。
例如:
public UtilType MyUtility
{
public void Calculate(int x,int y)
{
return x+y;
}
}
MyUtility
不应该允许被实例化,只能以静态方式访问它的方法。
在C#中,您可以使用static
关键字来实现:
public static class MyUtility
{
public static void Calculate(int x,int y)
{
return x+y;
}
}
这将使您能够编写
var result = MyUtility.Calculate(1, 2);
在你的代码中到处都是它。
然而,它并不是非常面向对象,因此应该始终考虑是否有更好的替代方案。面向对象设计关注的是数据和行为,而这样的静态类则是纯行为。这几乎与纯数据类一样糟糕,但通常二者会同时出现。
我个人认为过度使用静态类型是一种代码异味。
static
在OOD中是一种代码异味。静态(或共享)状态的概念在FP中或多或少是无意义的,因为一切都是不可变的 - 没有状态。 - Mark Seemann你试过使用静态类型吗?
public static class MyUtility
{
public static void Calculate(int x,int y)
{
return x+y;
}
}
并且...
public class AnyOtherClass
{
public void AnyOtherMethod()
{
MyUtility.Calculate(4,5);
}
}
优化 masher
的回答:
public final class Utilities
{
// private constructor
private Utilities(){ }
public static int add(int x, int y)
{
return x+y;
}
public static int subtract(int x, int y)
{
return x-y;
}
}
修改语言规范、编译器及相关工具、教程和教材等的巨大成本。
添加新关键字对现有Java/C#客户应用程序代码库的影响。
添加新类别变量会增加学习该语言的难度。
不必创建私有构造函数,您可以使用枚举类型(默认情况下具有私有构造函数)。
public enum Utilities {
;
public static int add(int x, int y) {
return x+y;
}
public static int subtract(int x, int y) {
return x-y;
}
}
为什么这个不起作用?(使用Java)
public class Utilities
{
private Utilities() {} //added in an edit after reading comments
public static int add(int x, int y)
{
return x+y;
}
public static int subtract(int x, int y)
{
return x-y;
}
}
现在你不能实例化它,它只有静态方法...
如何声明一个私有构造函数?
public class MyUtility
{
private MyUtility ( )
{
}
public static int calculate(int x,int y)
{
return x+y;
}
}
使用Java 5+,甚至可以使用静态导入。
...
import static MyUtility.calculate
...
void myMethod ( )
{
int sum = calculate( 1, 2 );
}
我认为对于原始问题的答案是,两种语言都是面向对象的。因此,对象是一等公民,即一切都是对象。
这就是语言的设计方式,它的预期使用方式以及编译器如何将代码部分链接起来创建程序的方式。
static
有助于使我们的生活更轻松,但有时我们必须为此付出代价。例如,当您希望覆盖静态方法时。