web-dev-qa-db-ja.com

String.format( "%s"、arg)が "null"とは異なるnull値の引数を表示するようにします

BeanのカスタムtoString()実装を検討してください。

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

someFieldがnullの場合、これによりthis is nullが生成されます。

明示的にreplaceAll(...)を呼び出さずに、別のテキスト、つまり?へのnull値引数のデフォルトのnull文字列表現をオーバーライドする方法はありますかtoStringメソッドで?

:Beanは、Formattableを実装できるスーパークラスから継承します( http://docs.Oracle.com/ javase/7/docs/api/Java/util/Formattable.html )しかし、私はこの作業を行う方法を理解していないようです。

[〜#〜] edit [〜#〜]:スニペットは例のために単純化されていますが、三項演算子を探していませんソリューションsomeField==null ? "?" : someField理由:

  • [可能性として] toString()に関与するフィールドが非常に多い可能性があるため、すべてのフィールドをチェックするのは面倒で流andではありません。
  • (もしあれば)私がほとんど制御できない他の人々は、独自のサブクラスを書いています。
  • メソッドが呼び出され、メソッドを2回呼び出すか、ローカル変数を宣言することを意味するnullを返す場合。

むしろ、Formattableインターフェイスを使用するか、カスタムFormatterfinal btwです)を使用して何かを行うことができますか?

33
VH-NZZ

Java 8を使用すると、これに対してOptionalクラスを使用できます。

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

私の意見では、最も良い解決策は、グアバのオブジェクトメソッドであるfirstNonNullを使用することです。次のメソッドは、someFieldがnullの場合に空の文字列を出力することを保証します。

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

Guava docs

外部ライブラリを必要としないJava 7ソリューションの場合:

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

replaceAll()を使用したくない場合は、someFieldにデフォルトのtext(String)を割り当てることができます。

ただし、しばらくすると、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);
}

これにより、複数の読みにくい三項演算子が不要になります。

5
JM Lord

三項演算子の繰り返しを避けるために、オブジェクトがnullであるかどうかをチェックし、trueの場合はデフォルト値を返す、より読みやすいメソッドでラップすることができます。

static <T> T changeNull(T arg, T defaultValue) {
    return arg == null ? defaultValue : arg;
}

使用法

String field = null;
Integer id = null;
System.out.printf("field is %s %n", changeNull(field, ""));
System.out.printf("id is %d %n", changeNull(id, -1));
System.out.printf("id is %s %n", changeNull(field, ""));

出力:

field is  
id is -1 
id is  
3
Pshemo

あなたはただできる

String.format("this is %s", (this.someField==null?"DEFAULT":this.someField));
2
joey.enfield

Java 7)から、Objects.toString(Object o, String nullDefault)を使用できます。

あなたの例に適用:String.format("this is %s", Objects.toString(this.someField, "?"));

1
Bob Rivers

someFieldの元の値を保持するには(nullが有効な値である場合)、 三項演算子 を使用できます。

String.format("This is %s", (this.someField == null ? "unknown" : this.someField));
1
Chris Forrence
public static String format(String format, Object... args){
    for (int i=0;i<args.length;i++){
        if (args[i]==null) args[i]="";
    }
    return String.format(format,args);
}

その後、メソッドを使用します、ok

1
eebb88