چرا اعضای با دسترسی private از کلاس توسط اشیای دیگر از همان کلاس قابل دسترسی هستند؟

+1 رأی
میانگین بازدید روزانه 0.591,494 بازدید

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

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

public class Test {
    private int data;

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

2 جواب

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

اما اینکه شما یه متغیری داشته باشید که حتی خود کلاس هم بهش دسترسی نداشته باشه به نظرم نیازی بهش نیست و کامنتش کنی سنگین تره.
جواب 6 سال قبل توسط soha1410 (40 امتیاز)
مساله تغییر متغیرهای خصوصی یک شی توسط شی دیگری از کلاس مشابه هست
متغیر خصوصی تعریف شده است (مانند مثال کد)
بله . من الان متوجه شدم و تست هم کردم. شما درست می فرمایید.
اما به نظرم این متدی که نوشتید باید از نوع static باشه. بازم این اشتباه کاربره و ضعف جاوا در عدم چک کردن این مسئله .
اگر استاتیک بزارید این اشکال به وجود نمیاد . از طرفی هم خود برنامه نویس این کد رو اضافه کرده دیگه.
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;
    }
}

 

 

 

جواب 6 سال قبل توسط Hosseyni (0 امتیاز)
ویرایش 6 سال قبل توسط Hosseyni

سوال های مشابه

+1 رأی
1 جواب میانگین بازدید روزانه 0.36809 بازدید
+1 رأی
2 جواب میانگین بازدید روزانه 0.11405 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.22512 بازدید
+2 رأی
2 جواب میانگین بازدید روزانه 0.772,767 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.28756 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.08221 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.15287 بازدید
+3 رأی
1 جواب میانگین بازدید روزانه 0.26772 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.17594 بازدید
کانال تلگرام جواب یاب
...