Kotlin 中的私有构造函数

     2023-02-21     150

关键词:

【中文标题】Kotlin 中的私有构造函数【英文标题】:Private constructor in Kotlin 【发布时间】:2018-04-01 13:04:11 【问题描述】:

在 Java 中,可以隐藏一个类的主构造函数,方法是将其设为 private,然后通过该类中的 public static 方法访问它:

public final class Foo 
    /* Public static method */
    public static final Foo constructorA() 
        // do stuff

        return new Foo(someData);
    

    private final Data someData;

    /* Main constructor */
    private Foo(final Data someData) 
        Objects.requireNonNull(someData);

        this.someData = someData;
    

    // ...

如果不将类分为 public 接口和 private 实现,如何使用 Kotlin 实现相同的目标?创建构造函数private 会导致无法从类外部访问它,甚至不能从同一个文件访问。

【问题讨论】:

【参考方案1】:
This is the Answer

class Hide private constructor(val someData: Data) 



By declaring the constructor private, we can hiding constructor.

【讨论】:

虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。 你的回复没有回答问题,两年前多次给出正确答案?【参考方案2】:

在此处查看 kotlin 文档:

https://kotlinlang.org/docs/reference/classes.html#constructors

https://kotlinlang.org/docs/reference/visibility-modifiers.html#constructors

class DontCreateMe private constructor ()  /*...*/ 

【讨论】:

【参考方案3】:

您甚至可以在拥有私有构造函数的同时做一些更类似于“模拟”公共构造函数的使用。

class Foo private constructor(val someData: Data) 
    companion object 
        operator fun invoke(): Foo 
            // do stuff

            return Foo(someData)
        
    


//usage
Foo() //even though it looks like constructor, it is a function call

【讨论】:

【参考方案4】:

这可以使用伴随对象:

class Foo private constructor(val someData: Data) 
    companion object 
        fun constructorA(): Foo 
            // do stuff

            return Foo(someData)
        
    

    // ...

伴生对象内的方法可以像周围类的成员一样被访问(例如Foo.constructorA()

【讨论】:

添加到这个是为了完整性。在 Java 中,您只能使用 Companion 调用伴随对象内的方法,例如 Foo.Companion.constructorA()。为了使其在 Java 中更自然,请使用 @JvmStatic 注释该方法,该方法将像静态方法一样运行(称为 Foo.constructorA())。

我们啥时候需要 C++ 中的私有构造函数?

】我们啥时候需要C++中的私有构造函数?【英文标题】:WhendoweneedaprivateconstructorinC++?我们什么时候需要C++中的私有构造函数?【发布时间】:2011-09-2722:48:06【问题描述】:我对C++中的私有构造函数有疑问。如果构造函数是私有... 查看详情

Python中的私有构造函数

】Python中的私有构造函数【英文标题】:PrivateConstructorinPython【发布时间】:2012-01-0223:11:18【问题描述】:如何创建一个只能由类的静态函数调用而不是从其他地方调用的私有构造函数?【问题讨论】:Python中没有私有与公共方... 查看详情

抽象类中的私有构造函数

】抽象类中的私有构造函数【英文标题】:Privateconstructorinabstractclass【发布时间】:2012-07-2211:05:46【问题描述】:在Java中,在抽象类中使用私有构造函数的目的是什么?在评论中我得到了这个问题,我很好奇,在什么情况下我... 查看详情

kotlin语言中的继承与构造函数(详解)(代码片段)

        学习kotlin时,有很多小伙伴无法理解为何有的继承结构父类后面需要加括号,有时候却不用加括号,本篇文章小编将为你们解除这个困惑!顺便为大家详解一下kotlin中的主构造函数和次构造函数。   ... 查看详情

带有命名参数的 Kotlin 中的 Dagger 2 构造函数注入

】带有命名参数的Kotlin中的Dagger2构造函数注入【英文标题】:Dagger2constructorinjectioninkotlinwithNamedarguments【发布时间】:2018-07-0416:29:45【问题描述】:我有这个依赖:@SingletonclassSpiceMix@Injectconstructor(@field:[Named("oregano")]privatevaloregano... 查看详情

Java中的构造函数可以是私有的吗?

】Java中的构造函数可以是私有的吗?【英文标题】:CanaconstructorbeprivateinJava[duplicate]【发布时间】:2011-08-1611:01:53【问题描述】:可能的重复:QuestionaboutconstructorsinJavaCanaconstructorinJavabeprivate?Java中的构造函数可以是私有的吗?我... 查看详情

私有类语法中的复制构造函数

】私有类语法中的复制构造函数【英文标题】:CopyconstructorinprivateclassSyntax【发布时间】:2015-04-3011:35:00【问题描述】:2小时后我将参加C++考试,但我仍然想知道复制构造函数的语法。到目前为止,我所理解的是,您将CopyConstruc... 查看详情

如何限制开发人员使用反射访问Java中的私有方法和构造函数?

】如何限制开发人员使用反射访问Java中的私有方法和构造函数?【英文标题】:HowtorestrictdeveloperstousereflectiontoaccessprivatemethodsandconstructorsinJava?【发布时间】:2011-11-2520:50:00【问题描述】:如何限制开发者使用反射访问Java中的私... 查看详情

内部类中的私有构造函数在外部类中初始化

】内部类中的私有构造函数在外部类中初始化【英文标题】:Privateconstrutorininnerclassinitializedwithinouterclass【发布时间】:2014-12-1209:07:27【问题描述】:是否可以初始化内部类的实例,该实例具有从外部类中标记为私有的构造函数... 查看详情

javajava中的单元测试私有构造函数(代码片段)

查看详情

构造函数可以访问 PHP 中的父私有属性吗?

】构造函数可以访问PHP中的父私有属性吗?【英文标题】:ConstructorcanaccessparentprivatepropertiesinPHP?【发布时间】:2014-12-1020:29:16【问题描述】:在处理PHP中的继承时,我发现缺乏一些知识,主要是关于constructors和private属性。我们... 查看详情

继承公共/受保护/私有构造函数

...*...*/;classDerived:publicBasepublic:usingBase::Base;将强制继承Derived中的所有Base构造函数。但是公共/受保护/私有构造函数呢?classB 查看详情

TypeScript 构造函数中的私有变量声明以诱导 DI

】TypeScript构造函数中的私有变量声明以诱导DI【英文标题】:privatevariabledeclarationinTypeScriptconstructortoinduceDI【发布时间】:2017-11-1301:50:42【问题描述】:为了在Angular2中使用TypeScript引入依赖注入,我们使用如下代码:constructor(priv... 查看详情

Java中私有构造函数有啥用?

...013-06-2422:26:04【问题描述】:我想知道私有构造函数在Java中的用途。在Java中使用私有构造函数有哪些不同的方法?【问题讨论】:当你不想让别人创建你的类的实例时(至少通过调用构造函数)。可能重复-***.com/questions/2816123 查看详情

访问从基类构造函数调用的重写方法中的私有方法

】访问从基类构造函数调用的重写方法中的私有方法【英文标题】:Accessprivatemethodinanoverridenmethodcalledfromthebaseclassconstructor【发布时间】:2020-07-2822:04:48【问题描述】:考虑以下代码:classMyBaseconstructor(b)this.myOverrideMethod(b);myOverri... 查看详情

为啥我可以在复制构造函数中访问私有变量?

...描述】:我了解到我永远无法访问私有变量,只能使用类中的get函数。但是为什么我可以在复制构造函数中访问它呢?例子:Field::Field(constField&f)pFirst 查看详情

kotlin中级---初识kotlin中的对象.md

万物皆对象对象就是类的实例化用Kotlin描述对象classFriendvarname:String=""varhairColor:String="".....愉快的构造1.主构造函数:classFriendconstructor(valname:String,valage:Int)主构造二下面这种构造纯粹的传值,并不在这 查看详情

Scala案例类私有构造函数但公共应用方法

...下带有私有构造函数的案例类,并且我无法访问伴随对象中的应用方法。caseclassMeterprivate(m:Int)valm=Meter(10)//constructorMeterinclassMet 查看详情