Примитивтерді анық инициализациялау

Java примитивтерінде әдепкі баптау мәндері бар екенін түсінемін; мысалы, int үшін 0 .

Зерттеулерімнен осы құндылықтарға сүйенуім керек деп ойлаймын. Мен әрдайым нақты инициализацияны қамтамасыз етуге тиіспін бе?

Менің бағдарламамның бөлігі:

public class Calculator {

// Initialize value where it's declared?
private int value;

public Calculator() {
   //Initialize value in constructor?
}

public void add(int other) {
    value += other;
}
}
9
«Менің зерттеулерімнен осы құндылықтарға сенбеу керек сияқты». Тілдің ерекшелігі сен үшін сенімді дереккөз емес пе?
қосылды автор fge, көзі
Егер сіз әдепкі мәнді қажет етпесеңіз және логикалы түрде сыныптың әрбір данасында кем дегенде белгілі бір мәнге орнатылған даналық айнымалысы болса, онда конструкторды ол үшін пайдалануға болады.
қосылды автор NINCOMPOOP, көзі
Бұл құндылықтарға негізделгендіктен және басқа бағдарламашыларға қандай құндылықты пайдаланатыныңыз туралы көп білуге ​​болады.
қосылды автор Boris the Spider, көзі

7 жауаптар

Java арқылы шығарылған әдепкі мәндерді пайдалану мүлдем дұрыс, class данасының данасын немесе static өрістерін анық түрде іске қосудың қажеті жоқ. Java тілінің ерекшелігі мұны талап етеді, сондықтан тілдің кез келген іске асырылуы тиіс. Басқаша айтқанда, мүше айнымалылардың әдепкі мәндерін пайдалансаңыз, сіздің кодыңыз 100% портативті қалады. Бұл қарапайым және анықтамалық түрлерге де қолданылады (кейінірек null ).

Қосымша ақпарат алу үшін Java тілінің ерекшелігі бөлімінің 81-бетін қараңыз.

4.12.5 айнымалылардың бастапқы мәндері

     

Бағдарламаның әрбір айнымалы мәні оның мәнін пайдаланбас бұрын мәнге ие болуы керек:   - Әр сынып айнымалысы, даналық айнымалы немесе жиым компоненті a   әдепкі мән

Айқын инициализациялауды ұсынатын жалғыз оқиға - жергілікті айнымалы мәндерді жариялағанда:

Жергілікті айнымалы анықталған тағайындауға арналған ережелерді қолданып тексеруге болатын жолмен баптандыру немесе тағайындау арқылы нақты пайдаланылуы керек.

Дегенмен, жергілікті инициализации сәтсіздікке компиляция уақытының қатесі болып табылады, компилятор сіздің бағдарламаны іске қосардың алдында әрбір жетіспейтін инициализацияны анықтайды.

4
қосылды
Менің зерттеулерімнен осы құндылықтарға сенім артуға болмайды.

Сіз оларға сене аласыз. Сізге әйтпесе әйтпесе, зиян келтірілмейді.

Мен әрдайым нақты инициализацияны, ал егер солай болса, қайда?

керек пе?

Примитивтер үшін ешқандай нақты инициализацияны қамтамасыз етудің қажеті жоқ, мен оны қаламауды қаламаймын. Мен адамдарға инициализация жасауды сирек жасаймын және көремін, мысалы, int i = 0; , мысалы айнымалылар. Бірақ, жергілікті айнымалылар туралы айтатын болсаңыз, оларға нақты мән беру керек. Әдепкі бойынша, бұл жерде жасырын емес.

Бірақ іс бастапқы емес жағдайда пайда болған кезде, декларация нүктесінде немесе конструктор ішіндегі нақты инициализацияны орындау керек, себебі мәндер null деп, бұл < кодты> NPE кодын енгізіңіз. Декларациялау кезінде инициализациялаудың пайдасы - әрбір сіздің конструкторларыңызда инициализациялауға тура келмейді.

1
қосылды
Жергілікті айнымалы мәндерді әдепкі бойынша немесе «күлгін» айнымалы мәндерді инициализациялаудан аулақ болуыңыз керек. Бұл құрастырушы жасаған статикалық талдауды сізді ескермейтін код жолына ескертуге кедергі келтіреді. Мысалы, жергілікті айнымалыны жарияласаңыз және кейінірек оны мәнді тағайындамастан оқыған болсаңыз, компилятор сізді ескертеді. Егер сіз оны мағынасыз депкі бойынша баптандыратын болсаңыз, компилятор қатені анықтай алмайды. Мәселен, декларацияларды бос қалдырыңыз немесе нақты мәнмен инициализациялауға дейін айнымалыны жариялау үшін күтіңіз.
қосылды автор erickson, көзі
@erickson. Иә дұрыс. Шын мәнінде, мен бұл ғана. Жергілікті айнымалы мәндерді сізге қажет болғанда жариялау жақсы тәжірибе. бұл біртүрлі проблемаға тап болған кезде көп жұмыс жасайды.
қосылды автор Rohit Jain, көзі

Жалпы ереже бойынша Сіз жазған код әрқашан ең таңқаларлық нәрсені жасайды. Егер сіз анық түрде инициализацияланған айнымалы мән үшін нөлге тең емес деп ойласаңыз, таңқаларлық, сондықтан сіз нөлге тең болса да, әрқашан бастапқы мәнді тағайындауыңыз керек.

Сіз көрсеткен кодадағы менің жеке артықшылықым хабарландыру жарияланған кезде айнымалыны 0-ге инициализациялау болады. Бұл айнымалыдағы алғашқы операция + = болғандықтан және сандық әрекеттер үшін әдепкі мәнге сену дұрыс емес деп ойлаймын. Бұл үшін жақсы себеп жоқ, себебі бұл жақсы жұмыс істейді, себебі ол жай ғана қате сезінеді.

0
қосылды

Мүше айнымалы мәндері әдепкі мәндермен бапталады. Сондықтан сіз бұл туралы алаңдамайсыз. Бірақ әдепкі мәндермен немесе басқа мәндермен баптағыңыз келсе, оларды конструкторға орнатуға болады

0
қосылды
конструкторсыз: қоғамдық класс A {public int num = 2; public void A() {}}
қосылды автор Ramin Darvishov, көзі
мүмкін. Мен басқа әдістерді ұсынамын
қосылды автор Ramin Darvishov, көзі
конструкторға инициализациялау жақсы.
қосылды автор stinepike, көзі
бұл жақсы, менің жауапты конструкторға инициализациялауды ұсынғаны үшін төмендетілген деп ойладым :)
қосылды автор stinepike, көзі

Егер сіз шынымен алаңдаса, конструктордағы айнымалыларды баптаңыз. Дегенмен, мен сандық примитивті нөлден басқа ештеңеге баптаған жоқ.

Егер сіз кейбір кеден (және кедей) JVM-мен жұмыс істеген болсаңыз, бұл туралы алаңдату керек деп ойлаймын.

0
қосылды

Әдепкі мәндер сенімді.


Шын мәнінде олар әдеттегі нөлге қарағанда «көп» сенімді болады, өйткені әдепкі тапсырмалар орын алады - басқа барлық әрекеттер алдында.

0
қосылды

JVM қарабайыр инициализациясын әдепкі мәндермен сенімді түрде білуге ​​болады.


BTW, анық инициализация бұл жағдайда пайдасыз байт кодына аударылады.

Сізде бұл сынып бар дейді:

public class PrimitiveInitialization {
    int i = 0;
    int j;
}

Сәйкес келетін байт код болады

class PrimitiveInitialization {
  I i
  I j

  public ()V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object. ()V
   L1
    LINENUMBER 10 L1
    ALOAD 0
    ICONST_0
    PUTFIELD PrimitiveInitialization.i : I
    RETURN
   L2
    LOCALVARIABLE this LPrimitiveInitialization; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1
}

Айқын инициализация айнымалы i үшін бірнеше кодтық операцияларды қосады.

Бұл дегеніміз, әрқашан кодын оқуға ыңғайлы болу керек , себебі JIT, бұндай байт кодты орындау уақытында оңтайландырады.

0
қосылды