0

我正在制作一个应用程序,该应用程序旨在成为我的个人宠物项目,旨在通过计算机游戏将两辆车与另一辆车进行比较等等,我想创建一个小应用程序来突出车辆之间的差异,但是我遇到了一个绊脚石,即为每辆车的构造函数所采用的参数很大且难以阅读

这是使用给定构造函数创建对象的示例:

HeavyTank T110E5 = new HeavyTank("T110E5", 2200,54.56d, 875, 37, 30, 254,76,38, 203,127,70,300, 202, 6,32, 400,745,10);

我相信你会猜到我正在制作的这个应用程序是一个基于坦克世界的坦克比较器,我在其中对坦克统计数据进行硬编码,但正如你所看到的,所采用的参数很难阅读,因此很难创建新对象而不会感到困惑。每个坦克都有不同的统计数据,所以这意味着我必须单独硬编码接近 100 多个坦克。如果这里有人有减少混乱的解决方案,或者我愿意听取的建议。

我还想恢复我在顶部编造的一点,这个应用程序不用于商业目的,纯粹是我的一个宠物个人项目。

4

9 回答 9

3

我建议以简单的文件格式存储您的储罐数据,例如每个储罐一行的 CSV 文件。然后你的坦克对象可以将类似的东西InputStream作为参数并从文件中输入坦克详细信息。

如果您使用 CSV 文件,您只需使用典型的电子表格程序即可轻松编辑您的储罐详细信息。

于 2013-06-03T16:43:40.040 回答
2

这听起来像是构建器模式的完美用例。

关于如何实现这一点有很多 很好的例子。以下是 Google 在Guava 类中使用它CacheBuilder方式:

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .maximumSize(10000)
   .expireAfterWrite(10, TimeUnit.MINUTES)
   .removalListener(MY_LISTENER)
   .build(
       new CacheLoader<Key, Graph>() {
         public Graph load(Key key) throws AnyException {
           return createExpensiveGraph(key);
         }
       });

这个特定的例子甚至使用了方法链,但这并不重要。主要功能是newBuilder()设置一些默认参数,然后您可以通过一个或多个方法调用选择性地调整这些参数。最后,您调用build()以实际创建实例(并使用一长串参数调用实际的构造函数)。

于 2013-06-03T16:42:18.043 回答
0

JavaDoc + 好的 IDE 将帮助您确定需要提供哪些参数。

否则,您可以将参数包装在单个对象中并将其传递给构造函数。重载的构造函数会很好地工作,因为您可以解压缩参数并将其传递给原始构造函数。

如果您事先知道参数,则总是将它们放在属性文件中并使用java.util.Properties.

于 2013-06-03T16:40:24.110 回答
0

使用流畅的界面。虽然一般都用在 ccnstructor 外面,为什么不在里面。

于 2013-06-03T16:42:33.177 回答
0

您可能会考虑将该信息放在一个属性文件中,然后您可以轻松地对其进行编辑。然后,您的构造函数将采用属性文件的名称,并具有强制完整性和验证的额外工作。虽然我仍然偏爱强类型构造函数,但从长远来看,属性文件方法可能更容易使用。

于 2013-06-03T16:42:41.490 回答
0

如果您混合了必需参数和可选参数(具有合理的默认值),则可以使用构建器模式。Effective Java 的一个例子:

public class NutritionalFacts {
    private int sodium;
    private int fat;
    private int carbo;

    public static class Builder {
        private int sodium;
        private int fat;
        private int carbo;

        public Builder(int s) {
            this.sodium = s;
        }

        public Builder fat(int f) {
            this.fat = f;
            return this;
        }

        public Builder carbo(int c) {
            this.carbo = c;
            return this;
        }

        public NutritionalFacts build() {
            return new NutritionalFacts(this);
        }
    }

    private NutritionalFacts(Builder b) {
        this.sodium = b.sodium;
        this.fat = b.fat;
        this.carbo = b.carbo;
    }
}

然后您可以执行以下操作:

NutritionFacts cocaCola =  new NutritionFacts.Builder(240, 8). calories(100).sodium(35).carbohydrate(27).build();

前两个参数是必需的(240 和 8)。其他属性是可选的,可以通过恰当命名的方法提供。

如果您有大量必需参数,您仍然可以使用构建器模式;您可以检查它们是否已在build()方法中设置。

于 2013-06-03T16:43:39.617 回答
0

我建议实现一个没有任何参数的标准构造函数。Setter 和 Getter 可以通过 eclipse 生成。这有助于查看所有内容并添加或删除成员。接下来您应该做的是将所有车辆内容写入 XML 文件。标签可帮助您了解车辆名称、值等。添加和删除车辆也将更容易。您可以通过 JDOM 访问 XML 文件。只需读取车辆标签并使用 XML 文件中的值调用 setter 方法。这可以通过循环来完成。

最后,您唯一需要注意的是您的车辆 XML 文件。

如有任何问题,请随时询问。

于 2013-06-03T16:51:45.433 回答
0

我看到你有三个合理的选择:

1) 使用标准contructor("string", value, "string", value,...)格式。这可能比您希望在此程序中投入的更多努力。

2)对每个属性使用一个constructor()方法,然后是setPropertyName(value)方法。这将允许您轻松添加它们,但您仍然需要手动完成。

3) 从文件中读取数据。使用带有名称的列设置文件(以避免将“我忘记接下来会出现什么值”的问题移动到不同的地方)这应该是最好的。

于 2013-06-03T16:56:54.583 回答
0

我的建议是创建一个对象以在初始化时使用特定参数列表保存这些类型。您可以根据逻辑上组合在一起的类型来划分该对象。然后你只需要两个或三个构造函数,每个构造函数有五个参数。例如:

HeavyTank T110E5 = new HeavyTank("T110E5", 2200,54.56d, 875, 37, 30, 254,76,38, 203,127,70,300, 202, 6,32, 400,745,10);

会成为:

StatObject1 stat1 = new StatObject1(2200, 54.56d);
StatObject2 stat2 = new StatObject2(875, 37, 30);
StatObject3 stat3 = new StatObject3(254, 76, 38);
...
HeavyTank T110E5 = new HeavyTank("T110E5", stat1, stat2, stat3, ...);

或者,这在逻辑上适用于您的系统。这样做的好处是您可以将其应用于您创建的任何其他坦克,并且可以在每个特定于该数据的 StatObject 类中创建修改器。

于 2013-06-03T17:18:24.743 回答