考虑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
顺便说一句)完成任何事情?
在我看来,最好的解决方案是使用Guava的Objects方法,firstNonNull.如果someField为null,则以下方法将确保您将打印空字符串.
String.format("this is %s", MoreObjects.firstNonNull(this.someField, ""));
番石榴文件.
对于不需要外部库的Java 7解决方案:
String.format("this is %s", Objects.toString(this.someField, "?"));
使用java 8,您现在可以使用Optional类:
import static java.util.Optional.ofNullable; ... String myString = null; System.out.printf("myString: %s", ofNullable(myString).orElse("Not found") );
如果您不想使用replaceAll()
,可以为其分配默认文本(String)someField
.
但如果有一段时间,这可能null
再次分配.因此,您可以对该案例使用验证
this.someField == null ? "defaultText" : this.someField
关于这个问题有点晚了,但这可能是一个非常干净的解决方案:首先,创建自己的格式方法......
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); }
这消除了对多个难以阅读的三元运算符的需求.