【问题标题】:Java refer one switch case from another or other alternativesJava 从另一个或其他替代方案中引用一个开关案例
【发布时间】:2012-11-27 07:47:35
【问题描述】:

这个问题更多是关于良好的编程实践和设计决策,但它以构造函数中的switch 为中心。

想法是以各种方式处理默认行为。默认构造函数 (Const()) 处理最简单或最常见的情况,参数化构造函数 (Const(int type)) 使用 switch 枚举其他特定情况。

为了保存一些代码,我可以在 case: 0 中定义默认构造函数,然后我可以从基本构造函数中引用它,如下所示:Const() { this(0); }(否则我无法这样做(即参考基本构造函数switch case),因为编译器要求一个且只有一个对另一个构造函数的引用作为第一条语句)。

但我也希望能够通过将default: case 发送到case: 0 来处理参数化构造函数中的错误输入(可能与错误消息相结合,例如“Invalid case.Using default case (0) instead.” ) 或反之,以使其更健壮。

我在这里搜索并阅读了其他问题(例如,请参阅 thisthat),我可以看到在哪里可以使用某种扭曲开关直通方案来完成,但为了语义和清晰度我想首先保留默认情况,或者另一方面,是否可以通过构造函数(例如this.Const(default)或排序)引用默认语句?可以做到吗?如果可以,从哲学上讲,解决这个问题的最佳方法是什么?

【问题讨论】:

  • Const(int type) 不是重写构造函数,它是参数化构造函数。

标签: java switch-statement


【解决方案1】:

用单独的方法处理每个案例怎么样?

那么你可以这样做:

case 0: handleCase0(); break;
default: complainThatThisShouldntHappen(); handleCase0(); break;

请注意,当您使用 Enum 而不是整数作为开关时,编译器的类型安全检查应该会废弃默认大小写。

【讨论】:

  • 我当然不能调用我尚未创建的对象的方法(这就是我在 switch 中所做的),可以吗?
  • @theUg:您可以从构造函数中调用实例方法,这是很常见的做法。因此,您的零参数构造函数将调用一个执行零参数构造的方法,而您的参数化构造函数也将从 case 0default 调用该方法。
  • 为什么不呢?例如,您可以使用returnObject = createObject0(args);
【解决方案2】:

虽然这个问题仍然代表学术目的,但我是这样处理这个问题的。在我使用基于类型变量的 switch 语句创建对象的构造函数之前(这可能会更好地处理特定的 Enum 类)。我的每个案例都加载了图像以与对象关联,这使得它非常麻烦。我现在所做的要简单得多:

// Default constructor for most common uses.
ClassName() {
    this(0);
}

// Parametrized constructor
ClassName(int type) {
    this.type = type;
}

现在图像是通过具有 GUI 任务的类加载的(从而分离职责),其中一个方法返回一个图像数组,该数组根据对象的类型进行索引,然后在 draw 方法中使用:

public draw (Graphics page, BufferedImage[] backgrounds) {
    // Misc. calculations.
    page.draw(backgrounds[type], getX(), getY(), null);
}

因此它提供了更优雅的解决方案。

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多