如何调用静态createCollage方法时无需传入p1、p2、p3参数
解决方案
首先明确现有代码的两个核心问题:
- 静态方法归属于类,你当前用
combine实例调用createCollage不符合静态方法设计规范,正确的调用形式应为AdvanceCollage.createCollage(p1,p2,p3),实例调用仅能语法通过,不符合静态特性的使用逻辑。 - 现有方法的像素复制逻辑完全错误:所有写入操作都作用在传入的p1、p2、p3图片本身,完全没有写入你提前创建的
combine空白画布,最终无法得到预期的拼贴结果。
实现无需传参调用的静态方案
要依托静态特性实现无需传入p1、p2、p3调用,只需把待拼贴的三张图片提前存入类的静态成员变量,静态方法可以直接访问同类的静态成员,具体实现步骤如下:
步骤1:给AdvanceCollage类新增静态成员变量存储待拼贴资源
public class AdvanceCollage { // 新增三个静态成员变量,存储待拼贴的三张图片 public static Picture collageP1; public static Picture collageP2; public static Picture collageP3; // 原有其他类代码保留 }
步骤2:重载无参版本的createCollage静态方法
public static Picture createCollage() { // 前置校验:避免未设置图片就调用方法 if (collageP1 == null || collageP2 == null || collageP3 == null) { throw new IllegalStateException("请先设置collageP1、collageP2、collageP3三张待拼贴图片"); } // 方法内部直接创建拼贴画布,无需外部提前实例化 Picture combine = new Picture(3 * collageP1.getWidth(), collageP1.getHeight()); Pixel sPixel, tPixel; // 拼贴第一张图,目标坐标从x=0开始 for (int x = 0; x < collageP1.getWidth(); x++) { for (int y = 0; y < collageP1.getHeight(); y++) { sPixel = collageP1.getPixel(x, y); tPixel = combine.getPixel(x, y); tPixel.setColor(sPixel.getColor()); } } // 拼贴第二张图,目标坐标从x=第一张图宽度位置开始 int p2Offset = collageP1.getWidth(); for (int x = 0; x < collageP2.getWidth(); x++) { for (int y = 0; y < collageP2.getHeight(); y++) { sPixel = collageP2.getPixel(x, y); tPixel = combine.getPixel(x + p2Offset, y); tPixel.setColor(sPixel.getColor()); } } // 拼贴第三张图,目标坐标从x=前两张图总宽度位置开始 int p3Offset = collageP1.getWidth() + collageP2.getWidth(); for (int x = 0; x < collageP3.getWidth(); x++) { for (int y = 0; y < collageP3.getHeight(); y++) { sPixel = collageP3.getPixel(x, y); tPixel = combine.getPixel(x + p3Offset, y); tPixel.setColor(sPixel.getColor()); } } return combine; }
步骤3:调用方式
// 提前给静态成员变量赋值,只需设置一次即可多次调用 AdvanceCollage.collageP1 = p1; AdvanceCollage.collageP2 = p2; AdvanceCollage.collageP3 = p3; // 直接调用无参静态方法,无需传入p1、p2、p3 Picture combine = AdvanceCollage.createCollage(); combine.explore();
注意事项
- 该方案仅适合单线程场景使用,多线程场景下静态成员变量会被多线程共享,可能出现参数错乱的问题,多线程场景建议还是通过传参调用。
- 如果你不需要强制使用静态方法,更合理的实现是将
createCollage改为Picture类的实例方法,直接操作当前实例的像素数据,不需要额外维护静态成员变量。
内容的提问来源于stack exchange,提问作者grumpy
相关产品推荐
相关产品推荐

