首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何定义只能由其伴生对象创建的枚举?(想想智能构造函数)

只能由其伴生对象创建的枚举是指在某个类中定义的枚举类型,只能通过该类的伴生对象来创建和访问。这种枚举类型可以通过智能构造函数来实现。

智能构造函数是指在类的伴生对象中定义的特殊函数,用于创建该类的实例。在创建枚举类型时,可以使用智能构造函数来限制只能通过伴生对象来创建枚举实例,而不能直接通过类名来创建。

下面是一个示例代码,展示如何定义只能由其伴生对象创建的枚举:

代码语言:txt
复制
class MyEnum private constructor(val value: Int) {
    companion object {
        private val enumValues = mutableListOf<MyEnum>()

        fun create(value: Int): MyEnum {
            val enum = MyEnum(value)
            enumValues.add(enum)
            return enum
        }

        fun getAll(): List<MyEnum> {
            return enumValues.toList()
        }
    }
}

// 创建枚举实例
val enum1 = MyEnum.create(1)
val enum2 = MyEnum.create(2)

// 通过伴生对象获取所有枚举实例
val allEnums = MyEnum.getAll()

在上述示例中,MyEnum 类的构造函数被声明为私有,只能在类内部访问。通过 create 方法,我们可以在 MyEnum 的伴生对象中创建枚举实例,并将其添加到 enumValues 列表中。通过 getAll 方法,我们可以获取所有已创建的枚举实例。

这种只能由其伴生对象创建的枚举可以提供更严格的控制,确保枚举实例的创建和访问符合特定的规则和逻辑。在实际应用中,可以根据具体需求来定义和使用这种枚举类型。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Scala专题系列(五):类与对象

Scala 是一个函数式编程语言,也是一个面向对象编程语言,与 Java、 Python、 Ruby、Smalltalk 等其他语言一样,Scala 在架构层面上提倡方法是:小处用函数式编程,大处用面向对象编程...1.scala中,主构造参数直接放在类名后面 class person(val name:String,val age:Int){ ….. } 主构造参数被编译成自段,值被初始化成构造时传入参数...,如上面的例子中,name和age成为person类字段 2:主构造器会执行类定义所有语句 构造参数也可以是普通方法参数,不带val或var,这样参数如何处理取决于它们在类中如何定义。...即可 在Java中会使用单例对象地方,在Scala中都可以用对象来实现 作为存放工具函数或常量地方 高效共享单个不可变实例 需要用单个实例来协调某个服务 伴生对象....比如 Array对象定义了apply方法,让我们可以用下面这样表达式来创建数组 Array("red","gree","yello") 这样我们就省去了构造器,也不用new出一个对象了 实例: class

56230

Kotlin|这些隐藏内存陷阱,你应该熟记于心

导航 学完本篇,你将了解到以下内容: 密封类构造函数传值使用细节; 内联函数,你应该注意地方; 伴生对象隐藏性能问题; lazy ,可能没你想那么简单; apply !...伴生对象,也许真的不需要 在 Kotlin 中,我们不能像 Java 一样,随便定义一个静态方法或者静态属性。此时 companion object(伴生对象)就会派上用场。...对于和业务强关联 key 或者 TAG ,可以选择使用伴生对象,并为增加 const val,此时语义上清晰比内存上损耗更加重要,特别在复杂业务背景下。...=构造者模式 apply 作为开发中常客,为我们带来了不少便利。其内部实现也非常简单,将我们对象函数形式返回,this 作为接收者。从而以一种优雅方式实现对对象方法、属性调用。...MainActivity初始化时,会先在 构造函数 中初始化 lazy 对象,即 SYNCHRONIZED 对应 SynchronizedLazyImpl。

81030
  • Scala 基础 (六):面向对象(下篇)

    一、抽象类 如何定义?...Scala底层对于伴生对象apply方法进行了优化,调用时可以省略方法名,直接使用单例对象名称+调用apply方法参数 当使用 new 关键字构建对象时,调用其实是类构造方法,当直接使用类名构建对象时...,调用其实时伴生对象 apply 方法 举个栗子: // 伴生类 // 构造器私有化 class Student private(val name: String, val age: Int) {...需要构造函数参数,使用抽象类,抽象类可以定义带参构造器,特质只是无参构造器。 四、扩展内容 类型检查和转换 obj.isInstanceOf[T]:判断 obj 是不是 T 类型。...结果是class package.xxx.className 获取对象类:obj.getClass 枚举类 需要继承 Enumeration。 用Value类型定义枚举值。

    48510

    Scala学习教程笔记二之函数式编程、Object对象伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习: 1.1:Scala定义一个简单类,包含field以及方法,创建对象,并且调用方法: class User...通常在伴生对象中实现apply方法,并在其中实现构造伴生对象功能。...而创建伴生对象时,通常不会使用new Class方式,而是使用Class()方式,隐式调用伴生对象得到apply方法,这样会让对象创建更加简洁: 2.1:比如,Array类伴生对象...;因此子类辅助constructor是一定不可能直接调用父类constructor;     注意:只能在子类主constructor中调用父类constructor,以下这种语法,就是通过子类构造函数来调用父类构造函数...Spark源码中也大量使用了这种匿名子类。     匿名子类,也就是说,可以定义一个类没有名称子类,并且直接创建对象,然后将对象引用赋予一个变量。

    1.1K60

    多面编程语言Scala

    多么简单,类定义就这么多,却能够做这么多事情,想想Java实现吧,差别太大了。我们先来分析下代码。...这段代码有以下值得注意地方: 我们可以把字段定义构造函数直接写在Scala定义里,其中,关键字val含义是“不可变”,var 为“可变”,Scala惯用法是优先考虑val,因为这更 贴近函数式编程风格...伴生对象伴生伴生对象伴生类在Scala面向对象编程方法中占据极其重要位置,例如Scala中许多工具方法都是伴 生对象提供。...伴生对象首先是一个单例对象,单例对象用关键字object定义。...这是一个典型伴生类和伴生对象例子,注意以下说明: 伴生类Person构造函数定义为private,虽然这不是必须,却可以有效防止外部实例化Person类,使得Person类只能供对应伴生对象使用

    2.5K40

    Kotlin学习日志(五)类与对象

    ,Java可以通过覆写带不同参数构造函数来实现,那么Kotlin已经在类名后面指明了固定数量入参,又该如何表示拥有其他参数构造函数呢?...有四种结果,我只放两个图 2.4 静态属性 之前我们伴生对象可以实现静态函数,同样也能实现静态属性,只要在伴生对象内部增加几个字段定义就行了,之前是用0和1表示动物雄雌,接下来用整型常量MALE表示雄性...,它们都在类伴生对象定义,外部可以通过类名直接访问该类静态成员。...枚举变量本质上还是该类一个实例,所以如果枚举类存在构造函数枚举变量也必须调用对应构造函数,这样做好处是,每一个枚举值不但携带唯一名称,还可以拥有更加个性化特征描述。...提出了“密封类”得概念,密封类就像是一种更加严格枚举类,它内部有且仅有自身实例对象,所以是一个有限自身实例集合,或者说,密封类采用了嵌套类手段,它嵌套类全部自身派生而来,定义密封类时候,需要在该类

    1.1K20

    kotlin基础--对象、接口、抽象类

    上次介绍了kotlin定义与初始化,接下来学习对象、接口、抽象类 一、对象 1.object关键字 object,类似Java中静态 三种使用方式: 1.1 对象声明 对应Java中单例类,只会在内存中实例化一次...如果你想要某个对象和一个类实例化绑定在一起,可以考虑伴生对象,使用 companion object 可以在一个类里定义一个伴生对象,一个类只能有一个伴生对象伴生对象也是静态,只会在类实例化或调用伴生对象内容...println(data) } 结果: com.aruba.mykotlinapplication.NormalClz@5e481248 DataClz(x=10, y=10) 注意:数据类自动实现个性化只对主构造函数定义参数起作用...main() { val normal = NormalClz(20, 30) val (x, y) = normal println("$x $y") } 数据类会自动为所有在主构造函数定义属性进行解构声明...7.运算符重载 之前使用集合是我们可以直接使用 "+" 、"-" 等来添加和删除元素 和c++一样,kotlin也支持运算符重载,只需要重载下面的函数就可以实现了: 8.枚举类 用来定义常量集合一种特殊类

    42310

    Scala 学习笔记之Object

    () 即可.对象构造器在该对象第一次被使用时调用.在本例中,Account 构造器在 Account.newUniqueNumber 首次调用时执行.如果一个对象从未被使用,那么构造器也不会被执行...对象本质上可以拥有类所有特性,但是不能提供构造器参数....在Scala中可以用对象来实现: 作为存放工具函数或常量地方 高效共享单个不可变实例 需要用单个实例来协调某个服务时(参考单例模式) 2....伴生对象 在Java中,通常会用到既有实例方法又有静态方法类,在Scala中,可以通过类和类同名 伴生对象 来达到同样目的: class Account{ val id = Account.newUniqueNumber...,参数N) 通常,这样一个 apply 方法返回伴生对象.举例来说,Array对象定义了 apply 方法,让我们可以用下面这样表达式来创建数组: Array("Mary", "had",

    48820

    Spark基础-scala学习(二、面向对象

    res3: Int = 2 伴生对象 如果有一个class,还有一个与class同名object,那么就称这个object是class伴生对象,class是object伴生伴生对象伴生类和伴生对象必须放在一个...,就是apply方法 通常在伴生对象中实现apply方法,并在其中实现构造伴生对象功能 而创建伴生对象时,通常不会使用new Class方式,而是使用Class()方式,隐式地调用伴生对象...apply方法,这样会让对象创建更加简洁 比如,Array类伴生对象apply方法就实现了接收可变数量参数,并创建一个Array对象功能 val a = Array(1,2,3,4,5) scala...,而不能精确判断出,对象就是指定类对象 如果要求精确地判断对象就是指定类对象,那么就只能使用getClass和classOf了 对象.getClass可以精确获取对象类,classOf[类]可以精确获取类...defined class Person defined class Student 匿名内部类 在scala中匿名子类非常常见,相当于java匿名内部类 定义一个类没有名称子类,并直接创建对象,然后将对象引用赋予一个变量

    67330

    Kotlin初探

    声明类型 函数 操作符 数组遍历及控制语句 类与枚举 扩展 代理 伴生对象 单例模式 扩展学习 1 优势 简洁 它大大减少你需要写样板代码数量。 安全 避免空指针异常等整个类错误。...我们一个简单"Hello World!"输出程序开始。与新建java文件类似,如下图,我们选择Kotlin File/Class.创建一个Kotlin文件。...倒序输出是downTo 9 类与枚举 数据类用来保存数据,类似于POJO类,使用data关键词进行定义,编译器默认会为数据类生成以下四个方法 equals() hashCode() toString...10 扩展 使用 11 代理 12 伴生对象 伴生对象(companion object )类似于java中静态关键字static。...在Kotlin没有这个关键字,而是伴生对象,具体用法 使用的话直接People.ID。 13 单例模式 在Kotlin中使用object修饰类时候,该类是单例对象

    1.6K20

    Kotlin学习笔记(四)-面向对象

    } } fun main(args: Array) { val music: MusicPlayer = MusicPlayer//后面没有括号,也就是说明不是调用构造方法创建对象...伴生对象成员全局独一份 伴生对象成员类似Java静态成员 静态成员考虑用包级函数、变量替代 JvmField 和JvmStatic使用后,可以用相同语法在Java中调用 方法重载 与Java相同...) hasCode,equals等方法,默认是没有无参数构造方法并且生成类是final,需要用allOpen去掉final,noArg创建无参数构造函数 allOpen/noArg: appModule...,那么要在枚举对象最后加上; 这基本是Kotlin中唯一一个需要强制写;地方 密封类 密封类与枚举区别:前者是子类可数,后者是实例可数 密封类(Sealed Class)子类必须和父类定义在同一个文件中...密封类子类是可数,因为子类只能在父类内部或者和父类处于同一个文件,在其他地方是无法创建子类

    85110

    《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)第五章 Kotlin 面向对象编程(OOP)1. 面向对象HelloWorld2. 面向对象编程思想简述3.Kotlin 面向

    新建一个类实例无需像 Java 一样使用 new 关键字,直接调用构造函数Greeter("Jack") 即可。 Kotlin 文件名以.kt为后缀,源代码文件中可以定义多个类。...该语句块中所有可执行语句都属于主构造器,在对象创建时都会被调用。...Person(name='Jack', age=29) 我们可以看出,调用构造函数Person("Jack",29) 创建对象,编译器通过层层向上委托,最终完成该对象创建。...要创建一个类实例,我们只要像普通函数那样调用构造函数即可: val person = Person("Jack",29) Kotlin中,不再使用new关键字 类成员 类可以包括 构造和初始化模块...伴生对象里面的函数,对应就是静态方法。

    1.5K30

    Scala

    具体来说,一个类和它伴生对象必须在同一个源文件中定义,并且它们名称必须相同。   伴生类和伴生对象之间可以互相访问对方私有成员。...下面是一个示例,展示了如何定义伴生类和伴生对象: scala Copy code class MyClass(val name: String) { def hello(): Unit = println...我们同时也定义了一个同名伴生对象 MyClass,它有一个名为 create 静态方法,用于创建 MyClass 实例。   ...使用伴生对象可以让我们方便地创建和操作类级别的属性和方法,从而使代码更加简洁和易于理解。...先讲⼀个概念——提取器,它实现了构造器相反效果,构造器从给定参数创建⼀一个对象,然⽽而提取器却从对象中提取出构造对象参数,scala标准库预定义了⼀些提取器,如上⾯面提到样本类中,会⾃动创建

    18830

    Swift vs. Kotlin 漫谈系列之类与继承

    不过,Kotlin 中可以用 object 关键字直接定义一个对象,在类内部,我们可以用 companion 为类声明一个伴生对象。...伴生对象成员可通过只使用类名作为限定符来调用,伴生对象成员看起来像 Java 静态成员,在运行时他们仍然是真实对象实例成员。...技术知识 Kotlin 类定义 Kotlin 使用 class 关键字声明类。 class A { } 类声明类名称、类头(指定类型参数、主 构造函数等)和大括号包围类体构成。...伴生对象 Kotlin 中可以用 object 关键字直接定义一个对象,在类内部,我们可以用 companion 为类声明一个伴生对象。...伴生对象成员可通过只使用类名作为限定符来调用,伴生对象成员看起来像 Java 静态成员,在运行时他们仍然是真实对象实例成员。

    3.7K40

    Android面试题之Kotlin几种常见

    初始化顺序 主构造函数里声明属性 类级别的属性赋值 init初始化块里属性赋值和函数调用 次构造函数属性赋值和函数调用 延迟初始化 lateinit关键字用来延迟初始化 isInitialized...return "ccc" } lateinit和by lazy lateinit只修饰var,lazy修饰val lateinit var只能用来修饰类属性,不能用来修饰局部变量,并且只能用来修饰对象...实现了copy函数,调用copy函数会生成一个新对象构造方法走是主构造方法,不会走次构造方法,也就是次构造函数里初始化属性不会copy过来 支持解构语法 支持运算符重载 数据类使用条件 经常需要比较...、复制或打印自身内容类,数据类尤其适合 数据类必须有至少带一个参数构造函数构造函数参数必须是val或是var 数据类不能使用abstract open sealed和inner修饰符 data...object关键字有三种使用方式 对象声明,生成单例 对象表达式,就类似匿名内部类,new onClickListener 伴生对象,类似静态方法或是静态属性 枚举定义常量集合,也可以定义函数 when

    7910

    3小时Java入门

    通过enum定义枚举类,其实也是一个class,只不过它有以下几个特点: 定义enum类型总是继承自java.lang.Enum,且无法被继承; 只能定义出enum实例,而无法通过new操作符创建...因为枚举类也是class, 所以我们可以定义private构造方法,并且,给每个枚举常量添加字段。 ? 十四,选择结构 Java选择结构主要有 if 语句和 switch语句。...二十二,抽象类 使用abstract声明方法为抽象类,抽象类只能够被继承,不能够创建抽象类实例。 抽象类方法可以被abstract声明为抽象方法,抽象方法没有执行语句。...Java中类支持静态属性和静态方法,Scala用伴生对象伴生方法概念将静态属性和方法与实例属性和方法分离。 Java循环中支持break和continue关键字,Scala循环中不支持。...5,C++ 中可以在类外部可以定义函数,而Java不允许在类和接口外面直接定义方法。

    2.7K30

    Scala学习二-面向对象

    : 类型){ //第一行需要调用主构造器或者其他构造器 //构造器代码 } object OopDemo{ //定义构造函数 class Monekey(var name:...一个class和obect具有相同名字,这个object称为伴生对象,这个class称为伴生类 注意: 伴生对象必须要和伴生类一样名字 伴生对象伴生类在同一个scala源文件中 伴生对象伴生类可以相互访问...[this] var name: String) //定义Monkey类伴生对象 object Monkey{ //定义monkeyName方法...} } apply方法 在Scala中,支持创建对象时候,可以不写new操作,要想实现不写new操作,就需要通道伴生对象appky方法来实现 定义apply方法 object 伴生对象名{...programMonkey对象 val p: Monkey = new ProgramMonkey //创建是不是Monkey类型对象,如果是,则将其转为Monkey

    88721
    领券