我搜索了很多,但没有一个答案是清楚的(至少对我来说!).现在我把这个问题放进去,因为我相信我无法在其他任何地方得到更明确的答案.
我什么时候应该在班上使用私有/静态构造函数?
我厌倦了通常的答案,所以请帮助我一些实时的例子和使用这些构造函数的优点/缺点.
我有一个类A(来自我无法控制的库),有一个私有拷贝构造函数和一个clone方法,以及一个B派生自的类A.我想实现clone的B为好.
天真的做法
#include <memory>
class A { // I have no control here
public:
A(int a) {};
std::shared_ptr<A>
clone() const
{
return std::shared_ptr<A>(new A(*this));
}
private:
A(const A & a) {};
};
class B: public A {
public:
B(int data, int extraData):
A(data),
extraData_(extraData)
{
}
std::shared_ptr<B>
clone() const
{
return std::shared_ptr<B>(new B(*this));
}
private:
int extraData_;
};
int main() {
A a(1);
}
Run Code Online (Sandbox Code Playgroud)
但是,失败了,因为复制构造函数A是私有的:
main.cpp: …Run Code Online (Sandbox Code Playgroud) 我最近正在浏览一个 Netflix开源项目
在那里,我发现使用最终类和私有构造函数.我完全清楚这一点
但我很想知道为什么它们一起使用.虽然方法是静态的,但我们可以在没有实例化的情况下使用它们,但仍然渴望了解它背后的设计原理.
我想看一个例子来阻止JaCoCo将私有空构造函数报告为Java类中的非覆盖代码.
在我的maven插件配置中
<rule>
<element>CLASS</element>
<excludes>
<exclude>JAVAC.SYNTHCLASS</exclude>
<exclude>JAVAC.SYNTHMETH</exclude>
</excludes>
</element>
</rule>
Run Code Online (Sandbox Code Playgroud)
是不是有类似的构造函数?
据我所知
最后一个类只是一个无法扩展的类.
除了在同一个类中的表单之外,不能实例化具有私有构造函数的类.这使得从另一个类扩展它无用.但这并不意味着它根本不能被分类,在内部类中我们可以扩展并调用私有构造函数.
所以我的理解是,如果我们用单个无参数私有构造函数创建一个类,那么将它们声明为final是没有意义的.那么为什么Java中的System类声明为final类,尽管它有单个无参数的私有构造函数?
我听说上课最后有一些表现.这是正确的,这是将System类声明为final的唯一原因吗?请澄清为什么Java像这样实现了System类.
我扩展了 apache-commons-3 中的类来添加我自己的实用函数,这些函数在其中不可用。例如:
public class CollectionUtils extends org.apache.commons.collections.CollectionUtils
{
/**
* Similar to collection.contains(member) except just doesn't throw NPE when set is null, simply returns false
* @param collection
* @param member
* @return
*/
public static <K> boolean contains(Collection<K> collection,K member)
{
return collection!=null && collection.contains(member);
}
}
Run Code Online (Sandbox Code Playgroud)
这解决了我通过同一个类使用函数和公共函数的目的CollectionUtils。
但是,Apache 在版本 4 中通过在实用程序类中引入私有构造函数来删除可扩展性。这里也有同样的讨论。
现在,如果我升级到版本 4,我的代码就会被破坏。扩展实用程序类以添加自定义/特定实用程序方法的最佳实践是什么?
我正在开发一个声音库(使用OpenAL),并从FMOD提供的界面中获取灵感,您可以在此链接中看到界面.
我已经提供了一些概念,如:声音,通道和通道组,你可以通过FMOD界面上看到,所有这些类都有一个私有的构造方法,例如,如果你想创建一个声音,你肥大使用功能createSound()提供由System类(如果您要创建Channel或ChannelGroup,则相同).
我想提供一个类似的机制,但我不明白它是如何工作的.例如,函数createSound()如何创建一个新的声音?构造函数是私有的,并且从Sound接口没有任何静态方法或友谊.是用过一些图案?
编辑:只是为了让OP的问题清楚,他/她不会问如何用私有构造函数创建类的实例,问题是在发布的链接中,如何创建具有私有构造函数和静态方法或朋友的类的实例功能.
谢谢.
今天,我一直在阅读静态类和私有构造函数.
静态类 - 我们无法在静态类上创建实例.我们不能继承静态类.仅生成单个实例.
私有构造函数 - 我们无法创建实例.我们不能继承.(我不知道生成了多少个实例.)
我创建了两个控制台应用程序,一个用于静态类,一个用于私有构造函数.
静态类代码
我理解生成的单个对象作为构造函数被调用一次.
私有构造函数代码
现在,我不明白是否生成了任何对象.
我有两个问题.
问题1.我没有发现Private构造函数和Static类之间有任何特别的区别.你能告诉我在哪种情况下我应该使用Private Constructor,我应该在哪里使用Static类,因为我可以使用它们.
问题2.如果我使用私有构造函数,会生成多少个对象?
谢谢.
编辑:
我认为人们不理解我的问题.我知道静态构造函数总是在第一个引用上调用一次.静态构造函数用于初始化类的静态成员.
问题1.我有一种情况:我需要创建一个无法实例化的类.我可以通过静态类或私有构造函数来完成.所以我的问题是"两者之间有什么区别吗?我应该使用哪一个?"
问题2.如果我使用私有构造函数,创建了多少个对象?如果answer为0,则私有构造函数的内存分配在CLR中如何工作.如果我使用私有构造函数,则没有内存分配.
我有一个基类和多个扩展该基类的类,它们都有一个私有构造函数。
我现在想创建一个静态函数来创建扩展类的新实例。通常我会有一个类似这样的函数头:
public static createInstance<T extends BaseClass>(clazz: { new(): T }): T
Run Code Online (Sandbox Code Playgroud)
当我想使用这个功能时:
createInstance(CustomClass)
Run Code Online (Sandbox Code Playgroud)
它会导致打字稿吐出此错误:
TS2345:“typeof CustomClass”类型的参数不可分配给“new () => CustomClass”类型的参数。无法将“私有”构造函数类型分配给“公共”构造函数类型。
代码实际转译的代码工作得很好。
我知道这个错误告诉我什么。但我找不到解决这个问题的方法。我已经搜索了很多,而且我似乎很孤独地遇到这个问题。有什么方法可以引用带有私有构造函数的类吗?
在Bjarne Stroustrup撰写的The C++ Programming Language一书中,作者说:
有时,当你设计一个库时,有必要或者只是方便地发明一个带有构造函数和析构函数的类型,其唯一目的是初始化和清理.这样的类型只能使用一次:分配一个静态对象,以便调用构造函数和析构函数.例如:
Run Code Online (Sandbox Code Playgroud)class Zlib_init { Zlib_init() ; //get Zlib ready for use ~Zlib_init() ; //clean up after Zlib }; Class Zlib { static Zlib_init x; / /... };遗憾的是,不能保证这样的对象在第一次使用之前被初始化,并且在最后一次使用之后被销毁在由单独编译的单元组成的程序中.
为什么作者将构造函数和析构函数保留为私有成员?如果我们在由单独编译的单元组成的程序中使用它,为什么这个方法不起作用?是否需要定义成员x来调用构造函数Zlib_init()和析构函数~Zlib_init()?那么这种方法的用途是什么?这是在本书的第10.4.9节.
java ×4
c++ ×3
c# ×2
.net ×1
clone ×1
clr ×1
final ×1
final-class ×1
object ×1
static-class ×1
typescript ×1
utility ×1