0

这个问题更多的是关于良好的编程实践和设计决策,但它集中在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)或排序)引用默认语句?可以做到吗?如果可以,从哲学上讲,解决这个问题的最佳方法是什么?

4

2 回答 2

1

如何以单独的方法处理每个案例?

然后你可以这样做:

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

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

于 2012-11-27T07:50:49.580 回答
0

虽然这个问题仍然代表学术目的,但这是我处理这个问题的方式。在我使用基于类型变量的 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);
}

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

于 2012-11-29T20:17:20.153 回答