Java重构报错:setCode(int)方法不适用于无参调用
错误原因
这个报错的核心是方法调用的参数不匹配:
- 你在
Refactor类中定义的setCode(int)、setCompanyName(String)这类setter方法,都要求调用时必须传入对应类型的参数(比如setCode需要传一个int类型的code值); - 但你在
AccData方法里调用这些setter时没有传任何参数,编译器认为你调用的方法不存在,所以抛出这个错误; - 而getter方法(比如
getCode())本身就不需要参数,所以调用不会有问题。
解决方法
1. 直接修正:调用setter时传入对应参数
如果业务逻辑需要给这些属性赋值,调用时必须传入符合参数类型的值,比如:
Refactor refactor = new Refactor(); // 传入int类型的code参数 refactor.setCode(1001); // 传入String类型的公司名称参数 refactor.setCompanyName("XX酒店");
2. 重载setter方法(支持无参调用)
如果需要让setter支持无参调用(比如设置默认值),可以在Refactor类中重载对应的setter方法,比如:
public class Refactor { private int code; private String companyName; // 原有的带参setter public void setCode(int code) { this.code = code; } // 新增无参setter,设置默认值 public void setCode() { this.code = 0; // 默认code值 } // 同理给companyName新增无参setter public void setCompanyName() { this.companyName = "默认公司"; } public void setCompanyName(String companyName) { this.companyName = companyName; } // getter方法不变 public int getCode() { return code; } public String getCompanyName() { return companyName; } }
这样你既可以带参调用setter赋值,也可以无参调用设置默认值。
3. 更合理的代码去重方案:使用继承/组合
你创建Refactor的目的是代码去重,单独实例化Refactor并调用setter其实没达到复用的核心目的,推荐用以下两种方式:
方式一:继承(适合"is-a"关系)
让Accommodation继承Refactor,直接复用父类的属性和方法:
// Refactor类作为父类,属性设为protected(或保持private用setter/getter) public class Refactor { protected int code; protected String companyName; public void setCode(int code) { this.code = code; } public int getCode() { return code; } // 其他setter/getter... } // Accommodation继承Refactor,直接使用父类的属性和方法 public class Accommodation extends Refactor { public static void AccData() { Accommodation acc = new Accommodation(); acc.setCode(1001); // 直接调用父类的setter System.out.println(acc.getCode()); // 直接调用父类的getter } }
方式二:组合(适合"has-a"关系)
让Accommodation持有Refactor的实例,通过这个实例复用方法:
public class Accommodation { // 持有Refactor实例 private Refactor refactor = new Refactor(); public static void AccData() { Accommodation acc = new Accommodation(); acc.refactor.setCode(1001); System.out.println(acc.refactor.getCode()); } // 可选:封装一层对外方法,隐藏内部的Refactor实现 public void setAccCode(int code) { refactor.setCode(code); } public int getAccCode() { return refactor.getCode(); } }
内容的提问来源于stack exchange,提问作者Westrany
相关产品推荐
相关产品推荐

