タイトルがすべてを物語っています。
たとえば、従業員クラスがあります
class Employee
{
private Date joinDate;
public Date getJoinDate()
{
return joinDate;
}
}
ここで getJoinDate は、内部の joinDate オブジェクトへの参照を返します。FindBug でコードを分析すると、「... ClassXYZ.pqrDate を返すことで内部表現が公開される可能性があります」という「悪意のあるコードの脆弱性」という警告が表示されました。
そのため、このゲッターにアクセスするコードは、インスタンス外のクラスのこのインスタンスに格納されている日付を変更できる可能性があります。だから私はコピーコンストラクタを使うべきですか
Q1. コピーコンストラクタを書くべきかどうか(または他のアプローチに従うべきか):
class Employee
{
private Date joinDate;
Employee(Employee e) //copy constructor
{
joinDate = e.joinDate;
}
public Date getJoinDate()
{
return joinDate;
}
}
Q2 フレームワーク オブジェクトのコピー コンストラクターを作成するにはどうすればよいですか? ビジネス オブジェクトのコピー コンストラクターは定義できますが、フレームワーク オブジェクトのコピー コンストラクターは定義できません。インスタンスを受け入れるフレームワーククラスの新しいインスタンスを返すすべてのメソッドを持つ汎用ユーティリティクラスが必要ですか?
class CopyConstructorUtil
{
public Date copyDate(Date date)
{
return new Date(date.getTime());
}
//....
}
また、Java Object クラスは、すべてのクラスに継承される clone() メソッドを提供します。しかし、それはオブジェクトを返します。では、単純に getters 内でキャストする必要がありますか? :
class Employee
{
private Date joinDate;
public Date getJoinDate()
{
return (Date)joinDate.clone();
}
}
Q3. どのアプローチが望ましいですか?または、他のアプローチを使用する必要がありますか?