- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
今天我用 Java 制作了一个俄罗斯方 block 克隆体,当需要实现 block 生成机制时,我编写了这个采用枚举的 switch 语句。我被告知要尽可能避免使用 switch 语句,但我不确定是否可以在这里避免使用 switch 语句,除非我彻底修改我最初的基于继承的设计选择。
为了实现不同类型的 block ,我决定制作一个名为 Block 的抽象父类(super class),并为每种特定类型制作一个子类。我还制作了一个标记 block 类型的枚举。例如,一个 ZBlock extends Block 对象会将 Type.ZBlock 枚举分配给它的 Type 字段变量。
private void spawnBlock(Type type){
switch(type){
case I:
currentBlock = new IBlock();
break;
case L:
currentBlock = new LBlock();
break;
case J:
currentBlock = new JBlock();
break;
case Z:
currentBlock = new ZBlock();
break;
case S:
currentBlock = new SBlock();
break;
case T:
currentBlock = new TBlock();
break;
default:
currentBlock = new OBlock();
}
}
当我开始考虑在这里不使用 switch 语句的方法时,除了摆脱我所有的子类并在单个非抽象 Block 类中对不同 block 的行为进行编程外,我想不出其他任何事情.但它可能会变得一团糟,因为不同的 block 具有不同的形状和踢墙数据。那么 switch 语句在这里是一个不错的选择吗?如果没有,我该如何改进我的代码,为什么?
最佳答案
Switch 比使用 if-else 语句更好。在我看来,这是更简洁的代码。只需将它与使用 if-else 的相同代码进行比较:
private void spawnBlock(Type type){
if(Type.I.equals(type)) {
currentBlock = new IBlock();
} else if(Type.L.equals(type)) {
currentBlock = new LBlock();
} else if(Type.J.equals(type)) {
currentBlock = new JBlock();
} else if(Type.Z.equals(type)) {
currentBlock = new ZBlock();
} else if(Type.S.equals(type)) {
currentBlock = new SBlock();
} else if(Type.T.equals(type)) {
currentBlock = new TBlock();
} else {
currentBlock = new OBlock();
}
}
但通常您有机会使用与 switch 或 if-else 不同的方法。看看其他答案或看看this .它解释了如何使用枚举改进代码并将逻辑直接放入枚举中。
关于java - switch 语句在这里是否合适,采用枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57585753/
假设我正在使用 segues 转换 View Controller 。我在 View Controller 1 上有一个 textField,在第二个 View Controller 上有一个标签。当
在下面的代码中,当我在表中插入数据时,回滚的目的是什么,如果我想回滚,我不应该插入它,那么使用回滚的合适方法是什么? BEGIN TRANSACTION Insert into dimCustomr
我一直在阅读一些帖子,并想知道是否有人可以介绍 TrieMap 何时比使用 HashMap 更可取的情况。 那么本质上是什么架构决策应该激励使用 TrieMap? 最佳答案 根据文档。 它是可以在多线
什么时候 do-while 比其他类型的循环更好?有哪些常见场景比其他场景更好? 我了解 do-while 的功能,但不了解何时使用它。 最佳答案 当您需要至少完成一次某事,但不知道启动循环之前的次数
fileExistsAtPath 的文档如下: Attempting to predicate behavior based on the current state of the file syst
当 XCode 分析我的代码时,它发现了潜在的内存泄漏。我使用 ARC,但我了解到 ARC 不处理 C 类型。因为我使用 CGImageRef 来创建 UIImage 并分配给 UIImageView
我有一个每天更新一次的大型数据集。我正在缓存对该数据进行昂贵查询的结果,但我想每天更新该缓存。我正在考虑使用 CacheItemRemovedCallback 每天重新加载我的缓存,但我有以下问题:
我了解 IoC 容器是什么,并且一直在阅读结构图。该技术似乎很容易使用。我的问题是,使用 IoC 容器的适当粒度级别是多少? 我看到以下可能的 IoC 应用级别: 打破所有对象之间的所有依赖关系——当
我用 Java 编写了一个应用程序。我从数据库中获取一个表(客户端),其中包含以下字段: 名称 |姓氏 |地址 在我的应用中存储这些数据的最佳解决方案是什么?我应该为每个客户端创建一个对象并将这些对象
这个问题在这里已经有了答案: Use of 'prototype' vs. 'this' in JavaScript? (16 个答案) 关闭 8 年前。 function A() { this
我已经试验了一段时间 asyncio 并阅读了 PEPs ;一些教程;甚至是 O'Reilly book 。 我想我已经掌握了窍门,但我仍然对 loop.close() 的行为感到困惑,我不太清楚何时
它是否正确,因为在 Windows 中并没有说它不好或不推荐。 例如像这样: int APIENTRY _tWinMain(HINSTANCE hInstance,
我在更新我的网站时遇到问题,谷歌搜索结果显示指向旧页面的链接,这些链接现在是 404,其中一些甚至包含已弃用的内容。 我的问题是关于 301 的使用。旧页面具有深层嵌套页面,如下例所示: ww
我使用 JUnit 和 FEST 对我们的应用程序进行 Swing 集成测试,我在测试用例中多次启动和停止。 @after 是否应该包含对 robot.cleanUp() 的调用? 最佳答案 一般规则
我是一名从未真正使用过 .dll 文件的程序员。当然,当我需要第 3 方软件时,例如图形库、帮助我创建图形的库等。我会将引用/ddl 文件添加到我的程序中并在我的代码中使用它们。 此外,您似乎可以将
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我目前正在尝试更多地利用 kotlin 协程。但我面临一个问题:在这些协程中使用 moshi 或 okhttp 时,我收到警告: “不适当的阻塞方法调用” 解决这些问题的最佳方法是什么?我真的不想不合
我有点不确定什么时候适合使用 Html.RenderAction() 来渲染我的 View ,什么时候不适合。我的理解是,因为它不是 ASP.NET MVC 的“官方”组件,所以使用它是不好的做法,它
假设你想开发你的 Controller ,以便你使用 ViewModel 来包含你渲染的 View 的数据,所有数据都应该包含在 ViewModel 中吗?什么条件下可以绕过 ViewModel? 我
您何时考虑在 .NET 中创建用户控件?您是否有一些基本标准来从页面中排除您的代码并引入新的用户控件? 通常我倾向于遵循这些来决定我是否需要用户控件: 当使用单独的用户控件使页面看起来更具可读性时 当
我是一名优秀的程序员,十分优秀!