静态类是正确的吗?

时间:2010-12-23 10:39:50

标签: oop class object static-class

我正在开发一个Java应用程序,它管理一个银行贷款数据库。 我在应用程序开发方面有一些经验,我有一个可能很愚蠢的问题,但是我一直在谈论这个问题,因为我一直在学习开发语言,而且从来没有得到过令人信服的答案。

在我的程序中,我有许多类和方法,我将其用作通用工具。例如,我有一个用于Excel编写的类,一个用于文件读/写的类,一个以各种方式操作字符串的类,一个以我的默认格式显示Dialogs / Messages的类,一个用于特定数学函数的类(如数学)等。

我无法想象这些类是真实的东西(就像类/对象一样),但它们作为工具箱出现在我的脑海中。这就是我让它们静止的原因。以这种方式我写了例如

excelWriter.create("C:\temp.xls");
excelWriter.append("mydata1\tmydata2\nmydata3\tmydata4");
excelWriter.close();

而不是

ExcelWriter myExcelWriter;
myExcelWriter.create("C:\temp.xls");
myExcelWriter.append("mydata1\tmydata2\nmydata3\tmydata4");
myExcelWriter.close();

这更适合我,因为我认为工具箱就像我一直在那里的东西,我不需要每次想要使用它时都创建一个对象。 C ++的数学不是同样的情况和静态吗? 我和很多同事和编码朋友讨论过这个问题,他们中的大多数人说我必须创建一个对象,因为这就是面向对象编程的全部内容。

我理解他们在另一个背景下所说的话: 在业余时间,我一直在使用VB.net开发一款纸牌游戏。在那里,我有游戏,玩家,甲板,手的课程。我在每个班级中制作的对象很多,因为我有很多游戏,玩家,套牌,手牌。他们可以被想象成真实的东西。当你开发游戏时,它是特别不同的。 游戏的开发更加面向对象,因为它包含真实的东西

我在想,我在这里有点特别错吗? 我想听听关于oop是什么的深入探讨。 我还想听听静态类的用途。

由于

3 个答案:

答案 0 :(得分:2)

不,至少在我看来,在这种情况下,只包含静态成员函数的类是不对的。第二个ExcelWriter类会更好。无论如何,你在哪里存储Excel输出的文件句柄?我希望不是在静态变量中?这是该课程数据成员的主要候选人。

在这种情况下,尝试将对象视为表示要写入的输出流。将来,您可能希望同时打开两个输出流,这对于您的“工具箱”类是不可能的。

有时,仅包含静态成员函数的类可用作对相关函数进行分组的方法,但这种情况很少见,通常意味着可以围绕包含数据的对象重新设计类。例如,静态成员函数可用作为类创建不同构造函数的方法。

答案 1 :(得分:2)

静态类和函数只应用于中性函数和计算。只有当你需要得到某些答案的时候。

当你想到你正在做什么和使用字面意思时,OOP设计非常容易。例如,在你的情况下,你使用了“myExcelWriter”这个词,它是一个excel作家。所以,如果它是某种东西,它就是一个对象。这意味着它需要一个实例。

总是只描述你自己在做什么,如果你正在做什么可以用名词描述那么它就是一个对象。如果它是形容词,则它是属性或类成员。如果它是动词则是一种方法。如果它是副词,则它是传递给函数的属性或变量。

静态类是包含独立函数的工具,只是对输入变量进行一些计算。 (再次像Math,只计算2个数字)

类中的静态函数是在该类的对象上使用的工具,不需要Instance的状态即可工作。 (如Int.Parse()

OOP更接近真正的语言IMO,这就是为什么以这种方式编程更直观。

答案 2 :(得分:1)

类没有来表示现实世界的东西。如果您使用它们可以使您的程序更容易理解,那么您做得恰到好处。

那就是说,一个类应该有数据和方法。您的excel和文件类对我来说似乎很好,但要警惕只有方法而没有数据的类。