Make String.format("%s",arg)显示空值参数与"null"不同

 幸福蜗牛yeshi牛 发布于 2023-02-12 16:50

考虑toString()bean 的自定义实现:

@Override
public String toString() {
    String.format("this is %s", this.someField);
}

this is null如果someField为null,则产生if .

有没有办法将null空值参数的默认字符串表示形式覆盖到另一个文本,即? 没有replaceAll(...)toString方法中显式调用?

注意:bean继承自可以实现的超类Formattable(http://docs.oracle.com/javase/7/docs/api/java/util/Formattable.html),但我似乎并不理解如何制作这项工作.

编辑:为了举例,该片段被过度简化,但我不是在寻找三元运算符解决方案,someField==null ? "?" : someField因为:

可能(可能)涉及很多领域,toString()因此检查所有字段过于繁琐且不流畅.

我无法控制的其他人(如果有的话)正在编写他们自己的子类.

如果一个方法被调用并返回null,则暗示调用该方法两次或声明一个局部变量.

相反,可以使用Formattable界面或有一些自定义Formatter(这是final顺便说一句)完成任何事情?

5 个回答
  • 在我看来,最好的解决方案是使用Guava的Objects方法,firstNonNull.如果someField为null,则以下方法将确保您将打印空字符串.

    String.format("this is %s", MoreObjects.firstNonNull(this.someField, ""));
    

    番石榴文件.

    2023-02-12 16:53 回答
  • 对于不需要外部库的Java 7解决方案:

    String.format("this is %s", Objects.toString(this.someField, "?"));
    

    2023-02-12 16:53 回答
  • 使用java 8,您现在可以使用Optional类:

    import static java.util.Optional.ofNullable;
    ...
    String myString = null;
    System.out.printf("myString: %s",
        ofNullable(myString).orElse("Not found")
    );
    

    2023-02-12 16:53 回答
  • 如果您不想使用replaceAll(),可以为其分配默认文本(String)someField.

    但如果有一段时间,这可能null再次分配.因此,您可以对该案例使用验证

     this.someField == null ? "defaultText" : this.someField
    

    2023-02-12 16:53 回答
  • 关于这个问题有点晚了,但这可能是一个非常干净的解决方案:首先,创建自己的格式方法......

    private static String NULL_STRING = "?";
    
    private static String formatNull(String str, Object... args){
        for(int i = 0; i < args.length; i++){
            if(args[i] == null){
                args[i] = NULL_STRING;
            }
        }
    
        return String.format(str, args);
    }
    

    然后,按原样使用它......

    @Test
    public void TestNullFormat(){
        Object ob1 = null;
        Object ob2 = "a test";
    
        String str = formatNull("this is %s", ob1);
        assertEquals("this is ?", str);
    
        str = formatNull("this is %s", ob2);
        assertEquals("this is a test", str);
    }
    

    这消除了对多个难以阅读的三元运算符的需求.

    2023-02-12 16:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有