すべてオーバーライドするオブジェクトのコレクションがありますtoString()
。それらをコンソールに書き出すか、文字列に連結して、基本的toString()
にコレクションの を作成します。
これを実現するために for ループを使用できます。String.join()
ただし、明示的なループが取り除かれるため、はるかに優れた方法のようです。
import java.util.ArrayList;
public class Foo
{
private double member;
public Foo()
{
member = Math.random();
}
@Override
public String toString()
{
return "I'm foo " + member;
}
public static void main(String[] args)
{
ArrayList<Foo> foos = new ArrayList<>();
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
// print collection with loop
for (Foo foo : foos)
{
System.out.println(foo);
}
// print collection with String.join
System.out.println(String.join(System.lineSeparator(), foos)); // fails
}
}
機能するためSystem.out.println()
に、toString()
メソッドが呼び出されます。インターフェイスを明示的に実装する必要はありません。これは簡単なようで、一般的な方法です。
しかし、String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
仕事を始めるには、toString()
方法があるだけでは十分ではありません。が必要です。Iterable<? extends CharSequence>
つまり、Foo
実装する必要がありますCharSequence
。
次に、次のように委譲して、そのインターフェイスをすばやく実装しましたtoString()
。
import java.util.ArrayList;
import java.util.stream.IntStream;
import java.lang.CharSequence;
public class Foo implements CharSequence
{
private double member;
public Foo()
{
member = Math.random();
}
@Override
public char charAt(int index)
{
return toString().charAt(index);
}
@Override
public IntStream chars()
{
return toString().chars();
}
@Override
public IntStream codePoints()
{
return toString().codePoints();
}
@Override
public int length()
{
return toString().length();
}
@Override
public CharSequence subSequence(int start, int end)
{
return toString().subSequence(start, end);
}
@Override
public String toString()
{
return "I'm foo " + member;
}
public static void main(String[] args)
{
ArrayList<Foo> foos = new ArrayList<>();
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
foos.add(new Foo());
System.out.println(String.join(System.lineSeparator(), foos));
}
}
しかし、これはかなりの量のコードのようで、オブジェクトを に変換する可能性を保証することを除いて、この状況ではあまり機能していString
ませObject
んtoString()
。
ソリューションに導入されたボイラープレート コードは、削除されたボイラープレート コードよりも大きくなっています。
でクラスをうまくプレイするにはどうすればよいString.join()
ですか?
そのルートに進んでインターフェイスを実装する必要がありますか、それともその場で変換を実行する必要がありますか?