Java结构化方法链式调用:如何实现方法调用权限限制?
实现方法调用限制的解决方案
要实现你需要的方法调用规则,核心是通过接口分层+返回特定类型的方式,利用Java编译时的类型检查约束调用链,避免运行时才发现错误。具体实现步骤如下:
1. 定义分层接口
把不同调用阶段的方法拆分到不同接口中,明确每个阶段允许调用的方法:
// 初始状态接口:仅能调用logicOne或logicTwo interface ExampleInitializer { AfterLogicOne logicOne(String input); AfterLogicTwo logicTwo(String input); } // 调用logicOne后的可用方法接口 interface AfterLogicOne { int subLogicOne(String subInput); int subLogicThree(String subInput); } // 调用logicTwo后的可用方法接口 interface AfterLogicTwo { int subLogicTwo(String subInput); int subLogicThree(String subInput); }
2. 实现Example类
让Example类实现上述所有接口,在logicOne和logicTwo方法中返回对应阶段的接口类型(实际返回当前对象,但编译时会按接口类型做方法检查):
public class Example implements ExampleInitializer, AfterLogicOne, AfterLogicTwo { private String ex1; private String ex2; private int varOne; private int varTwo; private int varThree; @Override public AfterLogicOne logicOne(String input) { // 执行logicOne的业务逻辑 this.ex1 = input; return this; } @Override public AfterLogicTwo logicTwo(String input) { // 执行logicTwo的业务逻辑 this.ex2 = input; return this; } @Override public int subLogicOne(String subInput) { // 执行subLogicOne的业务逻辑 return varOne; } @Override public int subLogicTwo(String subInput) { // 执行subLogicTwo的业务逻辑 return varTwo; } @Override public int subLogicThree(String subInput) { // 执行subLogicThree的业务逻辑 return varThree; } }
3. 调用示例
创建对象时用ExampleInitializer类型声明,就能严格遵守预设的调用规则:
// 初始状态仅能调用logicOne或logicTwo ExampleInitializer obj = new Example(); // 合法调用:logicOne后调用subLogicOne/subLogicThree obj.logicOne("inputOne").subLogicOne("subInputOne"); obj.logicOne("inputOne").subLogicThree("subInputThree"); // 合法调用:logicTwo后调用subLogicTwo/subLogicThree obj.logicTwo("inputTwo").subLogicTwo("subInputTwo"); obj.logicTwo("inputTwo").subLogicThree("subInputThree"); // 以下代码会编译报错,符合预期: // obj.subLogicOne("直接调用子逻辑不允许"); // 初始状态无此方法 // obj.logicOne("inputOne").logicTwo("logicOne后不能调用logicTwo"); // AfterLogicOne接口无logicTwo方法 // obj.logicTwo("inputTwo").subLogicOne("logicTwo后不能调用subLogicOne"); // AfterLogicTwo接口无subLogicOne方法
原理说明
这种方式利用Java的编译时类型检查实现约束:
- 初始状态的
ExampleInitializer仅暴露logicOne和logicTwo,避免直接调用子逻辑 - 调用logicOne后返回
AfterLogicOne类型,仅能调用该接口定义的方法 - 调用logicTwo后返回
AfterLogicTwo类型,仅能调用该接口定义的方法 - 所有方法实际指向同一个Example对象实例,只是通过接口类型限制了可见方法范围
内容的提问来源于stack exchange,提问作者Rational Redneck
相关产品推荐
相关产品推荐

