如何从包含System.out.print语句的方法中仅获取返回值?
解决方法:拆分职责或添加开关控制
你现在的痛点很明确:pickAName把随机选名的核心逻辑和打印日志的副作用硬绑在了一起,导致只要调用拿返回值,就必然触发打印。下面给你两种实用的解决思路:
方案1:拆分方法(推荐,符合单一职责原则)
把打印逻辑和选名逻辑拆成两个独立方法,这样你可以按需调用:
- 纯功能方法:只负责随机选名字,无任何副作用
- 带打印的包装方法:调用纯功能方法+执行打印逻辑
代码示例:
import java.util.Random; public class NamePicker { public static void main(String[] args) { // 只想拿返回值?调用纯功能方法 String name = pickANameSilently("bob", "ed", "dan"); System.out.printf("Selected name: %s%n", name); // 想要带打印的?调用包装方法 String namedWithLog = pickANameWithLog("bob", "ed", "dan"); } // 纯功能方法:只返回随机名字,无打印 private static String pickANameSilently(String... names) { Random random = new Random(); return names[random.nextInt(names.length)]; } // 带打印的包装方法:包含日志逻辑 public static String pickANameWithLog(String... names) { System.out.printf("Randomly picking from %d names. %n", names.length); return pickANameSilently(names); } }
方案2:添加开关参数(灵活度高)
如果不想拆方法,可以给pickAName加一个布尔参数,控制是否执行打印逻辑:
import java.util.Random; public class NamePicker { public static void main(String[] args) { // 不打印,只拿返回值 String name = pickAName(false, "bob", "ed", "dan"); System.out.printf("Selected name: %s%n", name); // 需要打印日志的场景 String namedWithLog = pickAName(true, "bob", "ed", "dan"); } public static String pickAName(boolean printLog, String... names) { if (printLog) { System.out.printf("Randomly picking from %d names. %n", names.length); } Random random = new Random(); return names[random.nextInt(names.length)]; } }
另外提个小细节:你原来的代码里pickAName是非static方法,但main是static方法,直接调用会编译报错,上面的示例已经把pickAName改成static了,或者你也可以在main里创建类的实例来调用非static方法~
内容的提问来源于stack exchange,提问作者OneNoteMan
相关产品推荐
相关产品推荐

