【问题标题】:Easiest way to generate an array of constants in Java [duplicate]在Java中生成常量数组的最简单方法[重复]
【发布时间】:2021-10-07 19:29:32
【问题描述】:

我正在制作一个应用程序,我需要在其中拥有我的类 Note 的常量数组。为了代码可读性,理想情况下,我会在运行时为数组生成 108 个音符值(八度音阶 0-8,12 个音符一个八度音阶),而不是对其进行硬编码。这就是我目前正在尝试的方式:

public class Note{
   ...

   public static class Constants{

        public static final int lowestOctave=0;
        public static final int highestOctave=8;
        public static final int numOfOctaves=highestOctave+1;
        public static final int numOfNotes=numOfOctaves*12;

        private static Note[]allNotesArray=new Note[numOfNotes];
        {
          for(int i=0; i<numOfNotes; i++){
             allNotesArray[i]=new Note(/*Note params*/);
          {
        }
   }
}

目前,这会导致一个充满空值的数组。我在最终类中以相同的方式填充了数组,但我不确定如何为静态类执行此操作。我知道当你创建一个静态/静态最终数组时,数组本身和数组长度是不可改变的,但数组内的元素是可变的。因此,我可以在主 Note 类中填充 allNotesArray,但这违背了拥有常量类的目的。如果有人对如何让它以这种方式工作有任何想法,那就太好了,同样,如果有人有更好的方法来将数组创建为常量,那也太好了!

【问题讨论】:

  • 欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。不清楚您要问什么,因为您确实想使用常量,但不想使用常量并用值填充数组以将其用作常量,而是在运行时动态创建它们。请edit您的问题更详细地描述您正在尝试做的事情以及到目前为止您已经尝试过的事情。
  • Note 实例由哪些字段组成?您可以使用音符名称(A、A# B C 等)创建一个字符串数组,并对八度音阶数字使用双 for 循环。您或许可以计算出音符频率。
  • 我可能应该包括那个 tbf,Note 类采用 noteName,它是一个包含西方音乐中 12 个音符的枚举,以及音符的八度音阶,它只是一个 int。我想我可以创建一个函数来生成在我需要时会位于某个索引位置的注释,但这似乎不太有效。最感兴趣,因为知道最好的方法来做这件事会很好
  • 我认为您当前的方法没有任何问题。如果您将每个索引设置为Note 的实例,就像您在for 循环中所做的那样,那么您就没有空数组。您需要查看是什么让您认为数组中充满了空值。请记住,您必须创建Constants 的实例才能使该初始化程序块运行。或者你可以在它前面加上 static 关键字,让它在加载类时运行。我的猜测是你没有运行代码块,一旦你解决了这个问题,你就不需要做任何其他事情了,因为你的 for 循环很好。
  • 哦,太棒了,我不知道你可以把 static 放在那个代码块的前面,让它在静态类初始化时运行。这解决了我的问题,谢谢 - 随时做出详细说明的答案,以便我可以用可接受的答案奖励它:)

标签: java arrays constants


【解决方案1】:

您可以使用不可变列表——例如,参见 https://www.baeldung.com/java-immutable-list

您还可以编写一个小脚本来生成源代码,然后将其复制进去。这实际上可能比不可变列表更好,因为这样您就不必担心运行时错误,并且您可以获得所有IDE 中不错的代码完成功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2013-04-22
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2016-11-06
    相关资源
    最近更新 更多