当前位置: 首页 > 知识库问答 >
问题:

静态编程语言:伴随对象中的常量和顶层之间的区别

令狐凌
2023-03-14

在静态编程语言中创建常量的一般模式似乎是使用伴随对象。然而,我也可以在文件级别定义一个常量。为什么这不太受欢迎?我错过了什么吗?

伴随对象:

class Example {
    companion object {
        const val CONSTANT = "something"
}

在顶层:

const val CONSTANT = "something"

class Example {
}

共有3个答案

督翰学
2023-03-14

我认为这基本上取决于你是否希望这个常量成为类的一部分。如果你把它放在一个同伴对象中,它将像这样被访问:

Example.CONSTANT

如果您选择将常量放在文件级别上,它将从其他文件导入,并通常只需CONSTANT即可访问。

在类中放置常量以及将它们放置在顶层都是有原因的。

请注意,const关键字只能应用于String类型或基元类型(Int等)的变量(参考)。但在大多数情况下,不需要应用关键字。定义常量值,如下所示:

val constantFIS = FileInputStream("path")
颛孙和颂
2023-03-14

在伴生对象中定义字段会限制其可用范围,而不必仅导入该类,这有助于防止数据在意外的地方使用。

在文件中定义使该字段可用于与该字段相同的包中的任何代码。

const val CONSTANT = "something"

class Example {
}

创建以下内容:

Example.java

public final class Example {}

XKt。JAVA

import kotlin.Metadata;
import org.jetbrains.annotations.NotNull;


public final class XKt {
   public static final String CONSTANT = "something";
}

鉴于:

class Example {
    companion object {
        const val CONSTANT = "something"
    }
}

创建以下内容:

public final class Example {
    public static final String CONSTANT = "something";
    public static final Example.Companion Companion = new Example.Companion((DefaultConstructorMarker) null);

    public static final class Companion {
        private Companion() {}

        public Companion(DefaultConstructorMarker $constructor_marker) {
            this();
        }
    }
}
杜浩壤
2023-03-14

在Java中,您不得不将所有静态字段和方法声明放在一个类中,而且经常需要为此创建一个类。来到Kotlin,许多用户出于习惯而寻找类似的设施,最终过度使用伴生对象。

静态编程语言完全分离了文件和类的概念。您可以在同一文件中声明任意数量的公共类。您也可以声明私有的顶级函数和变量,它们将只对同一文件中的类进行访问。这是组织紧密关联的代码和数据的好方法。

与顶级声明相比,伴随对象的语法相当笨拙。仅当您特别希望将某些公共静态代码或数据与类关联,并希望用户使用该类的名称来限定对其的访问时,才应使用它们。这方面的用例非常罕见,在大多数情况下,顶级声明更自然。

无论何时,只要有一些私有静态代码/数据想要耦合到一个类,就可以更好地使用私有顶级声明。

最后,有时对生成的字节码的关注很重要。无论出于什么原因,如果您必须用静态编程语言代码生成一个Java类,使得该类具有静态成员,您必须求助于一个伴随对象和一个特殊的注释。

 类似资料:
  • 我有静态函数,它仅限于一些上下文(例如仅用于文档)。有两种替代方法可以将其定义为顶层函数或对象中的函数。 1. 2. 顶级函数的优点是它没有被包装在一个对象中,缺点是它可以从任何地方访问,没有类名前缀。这种情况有优点还是缺点或最佳实践?

  • 本文向大家介绍Go和Python编程语言之间的区别,包括了Go和Python编程语言之间的区别的使用技巧和注意事项,需要的朋友参考一下 走 Go是一种程序语言,由Robert Griesemer,Rob Pike和Ken Thompson于2007年在Google开发,并于2009年开源。Go的开发旨在简化并发编程和环境采用。 Python Python是Guido van Rossum在1991

  • 问题内容: 面向对象的编程语言和基于对象的编程语言之间有什么区别?JavaScript是面向对象还是基于对象? 问题答案: 维基百科说: 在计算机科学中,基于对象一词具有两种不同的含义: 某种程度上受限的面向对象编程,其中应用了以下一项或多项限制:(a)没有隐式继承,(b)没有多态性,(c)仅可用值的非常少的子集是对象(通常是GUI组件)。 基于原型的系统(即基于“原型”对象的系统,这些对象不是任

  • 问题内容: 我想知道两者之间的核心区别是什么 面向对象和基于对象的语言 我读过很多文章,所有人都说两件事 面向对象的语言支持OOP的所有功能,而基于对象的语言不支持OOP的所有功能,例如多态和继承。 他们给出了javascript作为基于对象和java作为面向对象的示例 像这个stackoverflow的帖子 面向对象和基于对象的语言之间的区别 但是我想知道这两种概念之间的核心区别是什么,而与任何

  • 问题内容: 此Java程序包含一个静态变量。但是我无法理解公共静态变量和私有静态变量之间的区别。 问题答案: 公共变量可在代码中的 任何 位置访问- 私有变量仅可在类本身内部访问。在这种情况下,您可以在类中使用它,所以很好。 请注意,静态变量是完全独立的问题-方法和类具有与变量相同的可访问性。 还有其他级别的访问权限- 和默认的“包”访问权限(无法明确指定)。有关更多详细信息,请参见Java语言规

  • 这个java程序包含一个静态变量。但是我不明白公共和私有静态变量之间的区别。