静态类与类的实例之间的区别

3

我有一个静态类,用于访问我在整个应用程序中使用的公共属性和方法。例如,我设置了一些属性在静态类中,在应用程序运行时,我可以从属性中获取值。

但是我也可以创建一个带有单例模式的非静态类,并以相同的方式使用它。

问题:在我的情况下哪种方法是正确的?

5个回答

3

取决于你想要实现什么。

我建议使用静态类来提供应用程序中的实用函数,并且大多数情况下避免使用单例模式。关于何时使用单例模式,请参见此问题

如果你的类代表系统中的某种实体(例如:用户、博客文章、产品、学生等),那么它不应该是一个静态类,而应在逻辑上每次使用独立实例时进行实例化。


3
以下示例显示,您可以在单例类中使用接口(这在静态类中是不可能的)。
我更喜欢这种模式,而不是一个大列表的静态方法/属性或几个静态类。
这些接口可以提供主题特定的设置,甚至可以用作其他方法或类的参数,而无需这些类知道设置来自何处,只要遵守合同即可。
public sealed class Settings : IUserStettings, IOSettings
{
    static readonly Settings instance = new Settings();

    static Settings(){ }

    Settings(){ }

    public static Settings Instance
    {
        get { return instance; }
    }

    //-- interface implementation

    public string UserName
    {
        get { throw new NotImplementedException(); }
    }

    // ---etc...

     public string filename
    {
        get { throw new NotImplementedException(); }
    }

    //-- interface implementation
}


public interface IOSettings
{
    string disk {get;}
    string path { get; }
    string filename { get; }
}

public interface IUserStettings
{
    string UserName { get; }
    string Password { get; }
}

这可以简单地使用如下:

    IOSettings iosettings = Settings.Instance as IOSettings;

    if(iosettings!=null){
        Filereader.ReadData(IOSettings iosettings);
    }

或者
    IUserSettings usersettings = Settings.Instance as IUserSettings;

    if(usersettings!=null){
        UserManager.Login(IUserSettings usersettings);
    }

但是惰性加载、从xmlDocument缓存和序列化配置设置也是一个不错的实践 ;) - Caspar Kleijne
+1 为写出所有步骤。 - TalentTuner

1

我的想法

1- 静态类用于没有实例化需求的情况,例如 .net Framework Math 类。

Math 类是中立的静态类,因为没有充分的理由去创建并维护这个类的对象。

2- 单例模式可能会与静态类概念混淆,但在单例模式中,你会得到一个完整的对象被创建到内存中。

所以最终取决于你的需求。


1
从面向对象/可测试性的角度来看,两者都不是特别好的解决方案。搜索 SO 中的 singleton 来查看论据。话虽如此,如果您需要/想要编写像 Math 一样的过程代码,则只能在状态上使用静态,而不是只使用静态。

0

我认为人们倾向于在实际需要静态类但需要确保类被初始化某些值时使用单例类。但如果可以的话,两者都应该避免使用。


使用单例模式是因为他们想要一个“带有一些值的静态类”,这告诉我人们没有理解面向对象的重点。静态类的整个重点在于它不应该有任何实例。 - Arve Systad
我个人认为,如果你想要“用某些值初始化静态类”,你应该看一下实例类或静态构造函数(很多人不知道)。 - Steve Mc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接