You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java/Groovy实现基础工厂方法时子类静态方法未触发问题(Katalon环境)

问题根源

  • Java/Groovy的静态方法不支持重写:子类定义的同名静态方法属于「方法隐藏」,不会触发多态调用,父类静态方法内部调用的ModelFromRow永远绑定父类自身的实现。
  • 父类ModelFromRow用private修饰,子类本身无法访问/覆盖该方法,进一步导致父类逻辑固定返回null。

修复方案(推荐:重构为实例工厂)

该方案符合面向对象多态设计,改动量小,适配Katalon运行环境:

1. 修改BaseModelFactory基类

改为抽象类,移除方法的static修饰,将ModelFromRow定义为抽象方法强制子类实现:

import java.util.stream.Collectors
import com.kms.katalon.core.testdata.TestData

public abstract class BaseModelFactory<T> {
    public List<T> ModelsFrom(TestData testData) {
        return testData.getAllData()
            .stream()
            .map { row -> this.ModelFromRow(row) }
            .collect(Collectors.toList())
    }

    public T ModelFrom(TestData testData, int rowNum) {
        return ModelFromRow(testData.getAllData().get(rowNum))
    }

    protected abstract T ModelFromRow(List<Object> row)
}

2. 修改子类工厂实现

移除静态修饰,添加@Override注解标记实现的抽象方法:

import java.text.SimpleDateFormat
import com.xxx.models.contract.ContractModel

public class ContractModelFactory extends BaseModelFactory<ContractModel> {
    @Override
    protected ContractModel ModelFromRow(List<Object> row) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");
        return new ContractModel(
            Integer.parseInt(row[0].toString()),
            row[1],
            dateFormat.parse(row[2].toString()),
            dateFormat.parse(row[3].toString()),
            // 其余参数
        )
    }
}

3. 调整调用方式

先实例化工厂类再调用对应方法:

def contractFactory = new ContractModelFactory()
WebUI.verifyNotEqual(
    contractFactory.ModelFrom(findTestData("whatever"), 1),
    null
)

补充说明

如果一定要保留静态调用逻辑,可以在父类静态方法中新增Class<T> modelClass参数,通过反射匹配子类的静态ModelFromRow方法,但是实现复杂度更高,且不符合工厂模式的常规设计,因此不推荐。

内容的提问来源于stack exchange,提问作者Mike Warren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:06:02