这个问题更多的是关于良好的编程实践和设计决策,但它以构造函数中的switch
为中心。
理念是以各种方式处理默认行为。默认构造函数(Const()
)处理最简单或最常见的情况,参数化构造函数(Const(int type)
)使用switch
枚举其他特定情况。
要保存一些代码,我可以定义默认构造函数,比如case: 0
,然后我可以从基本构造函数中引用它,如:Const() { this(0); }
(我不能这样做(即参考)从switch case开始的基本构造函数)因为编译器需要一个且只有一个对另一个构造函数的引用作为第一个语句。)
但我希望能够在参数化构造函数中处理错误的输入,并将default:
大小写发送到case: 0
(可能与“无效大小写”等错误消息结合使用。使用默认情况(0相反。“)反之亦然,以使其更健壮。
我在这里搜索并阅读了其他问题(例如,请参阅this和that),我可以通过某种扭曲的开关直通方案看到它可以在哪里完成,但对于语义和清晰度的缘故我想首先保留默认情况,或者另一方面,是否可以通过构造函数引用默认语句(例如this.Const(default)
或排序)?是否可以完成,如果是,那么这个问题的哲学最佳方法是什么?
答案 0 :(得分:1)
如何以单独的方法处理每个案例?
然后你可以这样做:
case 0: handleCase0(); break;
default: complainThatThisShouldntHappen(); handleCase0(); break;
请注意,当您使用Enum
而不是整数作为开关时,编译器的类型安全检查应该使默认情况过时。
答案 1 :(得分: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);
}
因此它提供了更优雅的解决方案。