我有一个满是实用功能的班级。实例化它的一个实例没有语义意义,但我仍然想调用它的方法。最好的方法是什么?静态类?抽象?
标记为final的类上的私有构造函数和静态方法。
- 马特:大卫@罗伯斯为B点出他的答案,你需要做的太空舱。它不能因为A的子类将无法invoke收藏指正A超类构造函数,因为它是私人的。然而……在不损害被显示。但jfyi:-)。
- "大卫,你为什么后两个答案吗?stackoverflow.com 632951 1844388 / / /
根据伟大的书"有效Java":
第4项:使用私有构造函数强制实现不稳定性
-试图通过将类抽象化来强制实现非恒定性是行不通的。
-只有当类不包含显式构造函数时,才会生成默认构造函数,因此可以通过包含私有构造函数使类成为不可常量:
1 2 3 4 5 6 7 8
| // Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
} |
因为显式构造函数是私有的,所以它在类外部是不可访问的。断言错误不是严格要求的,但它提供了保险,以防意外地从类中调用构造函数。它保证类在任何情况下都不会被实例化。这个习语有点违反直觉,因为构造函数是明确提供的,所以不能调用它。因此,如上文所示,最好包括注释。
作为副作用,这个习语还防止类被子类化。所有构造函数都必须显式或隐式调用超类构造函数,子类将没有可访问的超类构造函数来调用。
- 你为什么选择其他替代IllegalStateExceptionAssertionError过样,UnsupportedOperationException等?
- 本pacerier湖"。
- "bcsb1001给美国,这是本。
听起来您有一个类似java.lang.math的实用程序类。该方法有带有私有构造函数和静态方法的最终类。
但是要注意这对可测试性有什么作用,我建议您阅读本文静态方法是可测试性的死
- 这java.lang.math"死亡到testability"?
- 它可能是有趣的看到它如何评分在贯通code.google.com / P / testability浏览器
仅仅为了逆流而上,静态成员和类不参与OO,因此是邪恶的。不,不是邪恶的,但说真的,我建议使用具有单例模式的常规类进行访问。这样,如果您需要在任何情况下超越行为,这不是一个主要的重组。哦是你的朋友——)
我的02美元
- singletons被认为是邪恶的。
- 你是正确的,我知道这被认为是更糟。最终的解决方案的实践我想让最义,它完全可能的静态类A是要走的路。这件事是,如果所有的方法都有一个私人ctor静态的,为什么?我是一个私人ctor Singleton模式。如果他们想要一个没有实例类的成员,让他们有它;-)
- 你使用私有构造函数,以防止有人从instantiating或子类化的类。大卫回答:stackoverflow.com罗伯斯湖/问题/ 1844355 / Java的静态类/ & hellip;
- 没有更多的单身比依赖注入:邪恶)
- 面向对象有其有时代广场,但当它只是不实际的,这将是一种浪费或资源-例如,作为简单的东西math.abs(AS)。没有理由去instantiate对象只是为了instantiating学院为对象,当一个静态方法调用会到你只是没有做任何的O的开销。);
- "重私有构造函数。只是要确保不混合的方法,如果你的手是在类的静态成员,它没有面向对象的子类的成员参与和你没有得到的信息。那么,为什么有一个私人ctor on a类和静态方法。我如果你想防止子类化,最终是要走的路。现在,如果你创建一个类中你想使用Singleton模式在A,然后A私人ctor理解。因为你可以在类的静态实例的地方,它可以是负责的单身实例。
- "我同意,重数学对象,可能是不需要的。ABS的实例。当我听到"我有一个实用程序类",我math.avg(湖),你现在需要添加支持的一个加权平均。我看到URL URL参数发电机,在收购,这需要重新设计的支持链接或URL,只等等。论文有《面向对象的原因,基于CAN公用舱后端付费。所以,现在我要把标准的面向对象的防御战略,测试!/我的鸭子
- "Rob则认为:不能太多,那是纯粹的函数。一切都是独生子女,静态/ /全球相当多:)所有的邪恶
- 我个人认为它作为一个Java语言困境,1995,有生活类外的函数(如,例如在C + +),我提出的方法(非静态函数的类,instantiable)是非常有效的。
评论一下"私有构造函数"的论点:拜托,开发人员并没有那么蠢,但他们很懒惰。创建一个对象然后调用静态方法?不会发生的。
不要花太多时间来确保你的课不会被滥用。对你的同事有信心。不管你如何保护你的班级,总有一种方法可以滥用它。唯一不能误用的是一件完全无用的东西。
- a谁有湖泊(在生产代码中,学生需要jsut代码)object.staticmethod i认为你的能力overestimate of乔随机程序员!:P
声明类为static是没有意义的。只需声明它的方法EDCOX1×0,就可以从类名调用它们,就像Java的数学类一样。
此外,即使没有严格要求将构造函数设置为私有,但这样做是一个好主意。将构造函数标记为私有将阻止其他人创建类的实例,然后从这些实例调用静态方法。(这些调用在爪哇工作完全一样,它们只是误导和损害代码的可读性。)
- 所以,不要忘记让私有构造函数。
- 亚萨的约定"。我添加到我的位上的答案。谢谢。
- 如果你想静态方法在类内,类已是静态的。