本文介绍如何避免直接操作混乱的二维字符串数组,转而通过自定义 ShipImage 类和集合容器来安全、清晰地管理图像文件名与尺寸参数,并正确调用绘图方法。
本文介绍如何避免直接操作混乱的二维字符串数组,转而通过自定义 `shipimage` 类和集合容器来安全、清晰地管理图像文件名与尺寸参数,并正确调用绘图方法。
在原始代码中,String[][] ships = {{"Bismarck.png","Rodney.png"},{"170", "50"},{"20", "220"}} 的组织方式存在严重设计缺陷:它将横向并列的图像属性(文件名、宽度、高度)强行拆分为三行,导致索引逻辑极易出错——例如原 createScene() 中的 ships[i][0] 实际访问的是第一行第 i 列(即文件名),但 ships[i][1] 却试图访问第二行第 i 列(即宽度),而 i 超出 ships[0].length 时会越界。更关键的是,这种“按行分组”的二维数组无法自然表达“每个战舰对应一组完整属性”的语义。
✅ 正确解法是重构为面向对象模型:
public class ShipImage {
private final String fileName;
private final int width; // 推荐使用 int 替代 String 存储数值
private final int height;
public ShipImage(String fileName, int width, int height) {
this.fileName = fileName;
this.width = width;
this.height = height;
}
// Getter 方法(必需)
public String getFileName() { return fileName; }
public int getWidth() { return width; }
public int getHeight() { return height; }
}
在主程序中,使用 List
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
import java.util.*;
List<shipimage> ships = new ArrayList();
ships.add(new ShipImage("Bismarck.png", 170, 20));
ships.add(new ShipImage("Rodney.png", 50, 220));
BattleScene scene = new BattleScene(ships);
scene.drawScene(); // 清晰、可读、类型安全</shipimage>
对应的 BattleScene 类应适配新结构:
public class BattleScene {
private final List<shipimage> shipImages;
public BattleScene(List<shipimage> shipImages) {
this.shipImages = Objects.requireNonNull(shipImages);
}
public void drawScene() {
for (ShipImage ship : shipImages) {
// 参数明确:文件名、宽、高、固定 x/y 坐标(250, 7)
drawImage(ship.getFileName(), ship.getWidth(), ship.getHeight(), 250, 7);
}
}
// 假设此方法已存在(如基于 Graphics 或 JavaFX)
private void drawImage(String fileName, int width, int height, int x, int y) {
// 实际绘图逻辑
}
}</shipimage></shipimage>
⚠️ 注意事项:
- 避免字符串存储数值:"170" → 170(int),提升类型安全与运算能力;
- 优先选用 List 而非 Set:ArrayList 保证顺序且支持重复(若需去重再选 LinkedHashSet);
- 构造器参数校验:在 ShipImage 构造器中检查 fileName != null、width > 0 等;
- 不可变性:final 字段 + 无 setter,确保对象创建后状态稳定。
这种重构不仅消除了嵌套循环的索引混乱,还使代码具备可测试性、可扩展性(如后续添加旋转角度、透明度等属性),是 Java 工程实践中推荐的标准做法。










