+1 امتیاز
قبل در برنامه نویسی توسط (10 امتیاز)
ویرایش شده قبل توسط

آیا این زیر سوال رفتن اصل محصور سازی نیست که اشیا بتوانند به داده های خصوصی همدیگر دسترسی پیدا کنند؟

در واقع آیا این عدم رعایت استفاده از واسط ها (interface) برای دسترسی به داده های خصوصی امنیت شی را خراب نمی کند؟

public class Test {
    private int data;

    public void manipulatePrivateData(Test t){
        t.data=5;
    }
}
قبل توسط (10 امتیاز)
فکر نمی کنم این طور باشد،
 در این کد شی جاری به داده ی خصوصی شی ورودی دست رسی دارد
و در ویدئوی جاواکاپ، دکتر علی اکبری تصریح می کنند که این خصوصی بودن به معنای خصوصی بودن از دید کلاس های دیگر است، نه از دید اشیای دیگر
قبل توسط (1.1هزار امتیاز)
بله درست میگین. من الان کد رو کپی کردم توی سوال و ویرایش کردم که بهتر معلوم بشه.

2 پاسخ

0 امتیاز
قبل توسط (40 امتیاز)
دوست عزیز متغیر های private فقط توسط همون کلاس قابل دسترسی هستند . اگر هم می خواهید کسی نتونه تغییر بده final بزارید..

اما اینکه شما یه متغیری داشته باشید که حتی خود کلاس هم بهش دسترسی نداشته باشه به نظرم نیازی بهش نیست و کامنتش کنی سنگین تره.
قبل توسط (10 امتیاز)
مساله تغییر متغیرهای خصوصی یک شی توسط شی دیگری از کلاس مشابه هست
متغیر خصوصی تعریف شده است (مانند مثال کد)
قبل توسط (40 امتیاز)
بله . من الان متوجه شدم و تست هم کردم. شما درست می فرمایید.
اما به نظرم این متدی که نوشتید باید از نوع static باشه. بازم این اشتباه کاربره و ضعف جاوا در عدم چک کردن این مسئله .
اگر استاتیک بزارید این اشکال به وجود نمیاد . از طرفی هم خود برنامه نویس این کد رو اضافه کرده دیگه.
0 امتیاز
قبل توسط (0 امتیاز)
ویرایش شده قبل توسط

آیا این زیر سوال رفتن اصل محصور سازی نیست که اشیا بتوانند به داده های خصوصی همدیگر دسترسی پیدا کنند؟

این طور نیست, شما در گام اول از 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;
    }
}

 

 

 

سوالات مشابه

+1 امتیاز
2 پاسخ 549 بازدید
0 امتیاز
1 پاسخ 800 بازدید
+2 امتیاز
2 پاسخ 3.6هزار بازدید
0 امتیاز
1 پاسخ 981 بازدید
+1 امتیاز
1 پاسخ 355 بازدید
0 امتیاز
1 پاسخ 767 بازدید
+3 امتیاز
1 پاسخ 958 بازدید
...