ABA


"שאלה לגבי קאונטר של מחלקה בג'אווה"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #11072 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 11072
Gman
חבר מתאריך 31.3.02
1846 הודעות
   22:43   12.12.12   
אל הפורום  
  שאלה לגבי קאונטר של מחלקה בג'אווה  
 
   היי
אני רוצה לעשות קאונטר ברמת המחלקה, כך שכל הוספת מופע של אותה המחלקה תקדם אותו ב-1.

עד כאן, הדברים די פשוטים,
אני יוצר משתנה סטטי, ובכל קריאה לבנאי אני מקדם אותו.
עד כאן הכל מובן.

עכשיו, אני רוצה שגם לכל מופע של המחלקה יהיה ID ייחודי - חשבתי שפשוט זה יהיה ערכו של הקאונטר באותו רגע.
אלא שאם אני רוצה להגדיר את אותו ID כמשהו קבוע (Final), אני לא יכול לשנות אותו מתוך הבנאי, ולהפך, אם אני מגדיר אותו בתוך הבנאי, הוא מוגדר רק בסקופ שלו ולא על כלל המחלקה.

איך פותרים את זה?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  Factory Zippo  13.12.12 10:29 1
  למה אתה מתכוון כקבוע? dvir8 14.12.12 00:32 2
     חשבתי על זה קצת וככה באמת יישמתי את זה Gman 16.12.12 18:49 3
         הפתרון הפשוט בסדר, כל עוד יצירה של אובייקטים חדשים מתבצעת בת'רד יחיד. Zippo  20.12.12 00:20 6
     כי הפתרון הזה לא מתאים, המשתנה id ספציפי למופע, וכל שינוי שלו תקף רק לאותו המופע נחמיה  16.12.12 23:23 4
     counter הוא הסטטי Frozen_Prince  17.12.12 10:46 5

       
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   10:29   13.12.12   
אל הפורום  
  1. Factory  
בתגובה להודעה מספר 0
 
שים את הקונסטרקטור כמתודה פרטית, ואל תאפשר יצירה בעזרת new.
תכתוב מתודה סטטית, שיוצרת ומחזירה אובייקט חדש.
אגב, המשתנה הסטטי של הקאונטר -> שיהיה volatile או שתבצע את ההעלאה במתודה שהיא sybchronized, אחרת אם יש קריאות משני ת'רדים שונים, אתה יכול לקבל שני אובייקטים עם אותו ID.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   00:32   14.12.12   
אל הפורום  
  2. למה אתה מתכוון כקבוע?  
בתגובה להודעה מספר 0
 
   למה לא לעשות משתנה מחלקה פרטי?

public class Exmaple
{
private int id;

public Example()
{
//increase static counter and initializing object id
this.id = counter++;
}
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Gman
חבר מתאריך 31.3.02
1846 הודעות
   18:49   16.12.12   
אל הפורום  
  3. חשבתי על זה קצת וככה באמת יישמתי את זה  
בתגובה להודעה מספר 2
 
   תודה רבה.

נראה לי הפתרון של הבחור מלמעלה קצת מורכב מידי לצורך מה שרציתי
תודה רבה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:20   20.12.12   
אל הפורום  
  6. הפתרון הפשוט בסדר, כל עוד יצירה של אובייקטים חדשים מתבצעת בת'רד יחיד.  
בתגובה להודעה מספר 3
 
אם יש יותר מת'רד אחד שיוצר אובייקטים כאלה, אתה מאבד את הביטחון של מופע יחיד עבור ID מסויים.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
נחמיה  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.5.05
5984 הודעות, 3 פידבק
   23:23   16.12.12   
אל הפורום  
  4. כי הפתרון הזה לא מתאים, המשתנה id ספציפי למופע, וכל שינוי שלו תקף רק לאותו המופע  
בתגובה להודעה מספר 2
 
   תצטרך להגדיר את id כסטטי.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Frozen_Prince 
חבר מתאריך 11.5.06
5341 הודעות
   10:46   17.12.12   
אל הפורום  
  5. counter הוא הסטטי  
בתגובה להודעה מספר 2
 
id לא צריך להיות סטטי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net