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

Java中如何标记不推荐使用但暂不删除的公共方法?

可选的标记方案

方案1:调整@Deprecated注解属性适配SonarLint规则

Java 9 开始@Deprecated注解新增了forRemoval属性,显式设置为false即可明确告知工具该方法仅不推荐使用,不会在后续版本移除,完美解决SonarLint的提示问题:

/**
 * 通用配置读取方法,仅特殊场景下允许使用
 * @deprecated 普通业务场景请使用对应配置项的类型安全Getter,例如 {@link #getLogLevel()}
 */
@Deprecated(since = "1.0", forRemoval = false)
public String get(String key) {
    return values.get(key);
}

这个方案是成本最低的原生方案,不需要引入任何第三方依赖,也符合Java官方对@Deprecated的语义定义:该注解本身就支持标记「不推荐使用但暂时保留」的API,只是SonarLint的默认规则把它和「待移除API」绑定了,显式声明forRemoval = false就能解除这个误报。

方案2:使用第三方语义化注解

如果你的项目已经引入了JetBrains的注解包(常用来做可为空/非空标记),可以使用@ApiStatus系列注解更精准地标记语义:

import org.jetbrains.annotations.ApiStatus;

/**
 * 通用配置读取方法,仅框架内部特殊场景或扩展开发时允许使用
 * 普通业务场景请使用对应配置项的类型安全Getter,例如 {@link #getLogLevel()}
 */
@ApiStatus.Internal // 明确标注是内部API不建议外部业务使用
public String get(String key) {
    return values.get(key);
}

IDEA等工具会识别这个注解,在开发者调用时弹出对应的不建议使用的提示,语义比默认的@Deprecated更清晰。

方案3:API签名层面增加调用门槛(最高效的拦阻方式)

如果希望从使用层面尽可能避免开发者误调用通用方法,可以给方法增加一个仅内部使用的标记参数,从语法层面提高调用成本:

// 先定义一个仅内部可见的标记类
public final class InternalAccessMarker {
    private InternalAccessMarker() {}
    public static final InternalAccessMarker INSTANCE = new InternalAccessMarker();
}

// 改造通用get方法
public String get(String key, InternalAccessMarker marker) {
    // 可选加校验,防止外部随便传null绕过
    if (marker != InternalAccessMarker.INSTANCE) {
        throw new UnsupportedOperationException("仅内部特殊场景允许调用通用get方法");
    }
    return values.get(key);
}

普通开发者如果要调用这个方法,必须传入标记类实例,而这个实例如果不对外暴露的话,业务侧根本无法正常调用,只有内部特殊场景可以合法调用,比单纯的注解标记拦截效果好得多。


内容的提问来源于stack exchange,提问作者Jens W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:54:03