【问题标题】:What is the easy way to accept about one hundred inputs for a java method?为 java 方法接受大约一百个输入的简单方法是什么?
【发布时间】:2014-02-19 21:29:40
【问题描述】:

我正在使用 java 来制作游戏。我想制作一种方法,可以很容易地创建一个只有几行代码的世界。我想要一个这样的方法...

public void makeLevel(see following*)
{
if (... == 1
{
drawGrass(0, 16);
}
......
}
  • 我想要一个简单的方法来在这里拥有大约 100 - 200 个输入。

我想这样称呼它

makeLevel(1,2,1,1,2,2,1,3,2,1,2,2,1,2,1,2,3,2,2,2,2,1,2,1,2,2,1,2,1,2,1,2,3,2,1,2,3);

我还将有一个名为 drawGrass 和 drawWater 的方法,它们将使用 Graphics2D 来绘制这些图片。

我认为您不需要我的代码,但如果您需要,请告诉我,我会放在这里。

我在想我可以以某种方式使用数组或类似的东西。

【问题讨论】:

    标签: java arrays methods


    【解决方案1】:

    请不要使用 100 个输入。使用数据结构(如果要命名参数,可以使用数组、Map 或自定义类)来保存数据。

    或者,您可能想要使用variadic arguments。例如:

    public void doSomething(int... args) {
        // treat args as an int[]
    }
    

    可以调用:

    doSomething(1, 2, 3);
    doSomething(1,2,3,4,5,6,7,8);
    // etc.
    

    但是调用代码中的 100 个参数实在是太残忍了。

    【讨论】:

    • 我无法想象 Variadic Arguments 会成为 100 多个项目的好解决方案。
    • @JustinNiessner - 同意。
    【解决方案2】:

    接受一个数组而不是单个输入。

    【讨论】:

      【解决方案3】:

      将值放入向量或数组列表中并传递此对象!

      【讨论】:

      • 向量被认为是过时的。显然这不是你的意思!
      • 真的吗?我不知道。我刚刚检查了 Java 7 Docs 并没有发现任何贬义词......你怎么知道?
      • 我明白了,我同意使用限制,但它没有被官方贬低。这恢复了我对知识的信心:-)
      • 题外话了,Vector 的主要问题是它的大部分方法都是同步的,所以即使不需要同步也会引入一些开销。当您不需要线程安全的集合时,请使用ArrayList(顺便说一句,这在Vector Javadocs 上有明确说明)
      【解决方案4】:

      如果您想创建一个友好的 API 以使用流畅的接口 (http://en.wikipedia.org/wiki/Fluent_interface) 是一个更好的选择,而不是传递一百个参数(这显然不是一个好主意),您可以执行以下操作:

      import static mylibrary.createALevel;
      
      Level mylevel = createALevel().withWater(...)
                                    .withGrass(...)
                                    .withXXX(...)
                                    .create()
      

      易于编写和理解,并具有其他重要优点(例如,如果您的某些配置是可选的)

      【讨论】:

      • 是的,我会将 API 方法与 @jrahhali 建议结合使用枚举,以便我们可以做诸如 addTerrain(int terrainSize, Terrain terrain)repeat(int times, LevelFragment levelFragment) 甚至 addTerrainWithGaps(int terrainSize, Terrain Terrain, int nGaps, Terrain gap, int gapSize) 之类的事情,并以有意义的方式轻松构建关卡较少重复的方式。
      【解决方案5】:

      我可以提出改进建议吗?我认为这里最大的“问题”首先是参数太多,其次是“魔术”数字太多。想想使用这种方法创建关卡的人。数字 3 是什么意思? 16岁呢?这不是一开始就很明显。

      所以,我要做的第一个改进是将这些数字转换为有意义的类型。也许把它们放在一个枚举中,比如:

      public enum Terrain
      {
          Grass,
          Sand,
          Water,
          Bush
      }
      

      如果您熟悉对象和类,我会更进一步,创建一个父地形类和一堆不同的子类型,如草、沙、水等。每个子类型都包含它的拥有自己的图像,并且会知道如何绘制自己。

      第二个改进处理大量参数。如果您不熟悉类和对象,那么地形枚举类型的二维数组可能是最好的。如果您对对象感到满意,那么我将创建一个 World 对象,该对象将具有诸如 Add(Terrain item) 之类的方法。

      希望对你有帮助。

      【讨论】:

        【解决方案6】:

        如果您需要对值进行分类,请尝试使用地图

        【讨论】:

        • 是的,我同意。我自己也经常使用 HashMaps。
        • 在这里特别有用,如果变量的顺序和“名称”很重要。然后你可以使用它的名字来获取你需要的变量值
        猜你喜欢
        • 1970-01-01
        • 2019-04-21
        • 2012-05-31
        • 2010-11-27
        • 2014-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多