آیا این زیر سوال رفتن اصل محصور سازی نیست که اشیا بتوانند به داده های خصوصی همدیگر دسترسی پیدا کنند؟
این طور نیست, شما در گام اول از Copy constructor در جای اشتباه استفاده کردید نوع صحیح اون میشه
public class Test {
private int data;
//defualt access
Test(Test t) { this(t.data); }
Test(int i) { data = i; }
public static void main(String[] strings){
Test valueTest = new Test(5);
//copy the object into test variable
// instead of using clone method
Test test = new Test(valueTest);
}
}
مثال ساده تر
class exam {
private String cop;
public exam(exam another) {
this.cop = another.cop; // you can access
}
}
اون طوری که مشخصه دلیل این کار فاش کردن داده اسست ولی برای دسترسی به شکل امن و نه برای دسترسی شکل غیر امن اشتباهه و بله باعث ناامنی می شه و برای اینکه چرا جاوا به این شکل مورد استفاده قرار می گیره دلیل اینکه clone ابجکت از نوع protected هست و مشکلات دیگر که از این سوال به دوراند . این است دلیل این روش .
در واقع آیا این عدم رعایت استفاده از واسط ها (interface) برای دسترسی به داده های خصوصی امنیت شی را خراب نمی کند؟
من رابطه ای نمی بینم بین کلاس بالا با interface .
در کتاب java in a nutshell, 6th edition در فصل دوم قسمت Reference Types (لطفا بر روی لینک کلیک کنید ) صریح گفتن پنج نوع Reference Types هست که یکی آنها کلاس ها هستند پس اگر ۲ شی به یک Reference اشاره کند در خطر است چون داده ها به اشتراک گذاشته می شوند ( از بحث داریم جدا می شیم به بحث concurrency می ریم ) ولی Copy constructor باعث کپی داده تو یک ابجکت می شود و یک اوبجکت مجازا می سازه پس تا اینجا امنه .
این قسمت از بحث بالای جداس
در آخر کلاس بالا کاملا ناامنه برای اینکه امنش کنیم (البته یک موردش که مربوط به حثمون میشه رو می گم ) از Defensive copying استفاده می کنیم :
public class Test {
private int data;
//defualt access
Test(Test t) { this(t.data); }
Test(int i) { data = i; }
public void manipulatePrivateData(Test t){
Test t = new Test(t);
t.data=5;
}
}