2017-06-22 10 views
2

私は文字列の解析結果のクラスを持っているので、その解析された値の代わりにそのソース文字列を返すtoString()を強制する必要があります。それはカスタムequals()/ hashCode()メカニズムも持っています。それでもデータクラスとしてマークする利点はありますか?データクラスのhashCode()、equals()、toString()のすべてを実装してもデータクラスを使用する必要がありますか?

答えて

4

自動生成された部品は、以下のとおりです。これらの関数のいずれかがある場合

- equals()/hashCode() pair, 
- toString() of the form "User(name=John, age=42)", 
- componentN() functions corresponding to the properties in their order of declaration, 
- copy() function. 

コンパイラが自動的にプライマリコンストラクタで宣言されたすべての のプロパティから、以下のメンバーを導出しますクラス本体で明示的に定義されているか、または基本タイプから継承された が生成されません。

componentN()機能がしかし、データクラスがを継承することができされていないfor ((a, b, c) in dataClass) { ... }

のように構造化代入できます。しかし、別の非データクラスを拡張するデータクラスを定義することもできます。

クラスによっては、クラスを拡張する可能性があると思われる場合は、データクラスにしないでください。

将来クラスを拡張するクラスがなく、destructionまたはcopy()関数が必要な場合は、それをデータクラスにしてください。

+0

ありがとうございました。私は今それをデータクラスとしてマークすることに自信があります。どのような方法でも拡張するべきではなく、破壊を使用することができます。 – glee8e

関連する問題