Неліктен ресурстармен айнымалы мәндермен жұмыс істемейді?

Бұл менің ең басты сұрағым - SO және менің ойымша, әлі де осындай сұрақ жоқ!

Мәселен мәселе:

Неліктен ресурстармен жұмыс істемейді, өріс айнымалыларымен жұмыс істейді?

Немесе басқа сөзбен айтқанда: Неліктен мен үшін жергілікті айнымалыға әрдайым керек?

Мұнда кейбір мысал код:

public class FileWriteTest {

    public FileWriter file;

    public void workingDemo() {

        try(FileWriter file = new FileWriter(new File("someFilePath")) {
           //do something
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void notWorkingDemo() {

        file = null;

        try(file = new FileWriter(new File("someFilePath")) {
           //do something
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

Маған осы конгрестің неге екенін түсіндіріп беріңізші?

23

6 жауаптар

Мысал айнымалы мәнін try-with-resources блоктарын орындау кезінде кез келген уақытта өзгертуге болады. Бұл инвариантты бұзып, тазалауды болдырмайды. Жергілікті айнымалы мәнні дәл осы себептен түпкілікті болып табылады.

БТЖ-ны жақсы сұрақ туындайды, неге біз Java-ке күш-жігерін жұмсаймыз? . C#, мысалы, бұл талап етпейді.

13
қосылды

Мен дизайнерлер өрісті жаман идеяны қолданған деп ойлаймын, себебі бұл объектіні пайдалану аймағынан қашуға мүмкіндік береді. яғни ол тек сынақ блогында жарамды, сондықтан оны кез-келген басқа жерге кіре алмауыңыз керек.

7
қосылды
Ол бұл жолдан да құтыла алады. Нүкте соңғы айнымалы мәнге ие, ол сол мәнді тәжірибе-ресурстармен аяқталмайынша ұстауға кепілдік береді.
қосылды автор Marko Topolnik, көзі
Иә, оны тек сынап көріңіз. Ресурстармен әрекеттесу кезінде жарияланған айнымалы мәндер түпкілікті қорытынды болып табылады. Атап айтқанда, Eclipse бұл қатені береді: «try-with-resource мәлімдемесінің ресурсы тағайындалуы мүмкін емес». Соңғы айнымалы сияқты емес.
қосылды автор Marko Topolnik, көзі
+1 дәл. Java кодексінде жарияланған барлық айнымалылардың кемінде 90% тиімді болып табылады. Әсіресе, олардың 99% -ы түпкілікті болып табылатынына қарамастан, барлық final әдіс парамдарын жариялау әсіресе ауыр.
қосылды автор Marko Topolnik, көзі
Олар, әрине, өз түпкілікті түпкілікті қалдырады, тек олар өзгеруі қажет. Бұған қоса, бұл өзгермейтін виртусты қамтитын идиомалардан бас тартуы мүмкін. Кодтық коэффициентті түпкілікті деп есептегенде қаншалықты аз когнитивті шиеленісу керемет!
қосылды автор Marko Topolnik, көзі
@MarkoTopolnik try өрістері түпкілікті жасалды ма?
қосылды автор Peter Lawrey, көзі
@MarkoTopolnik Мен мұны білмедім. Бұл мағынасы бар. Содан кейін қайтадан айнымалы мәндерді жақсырақ түпкілікті емес, оларды түпкілікті емес етіп жасау үшін пайдаланылмаған жағдайда түпкілікті түрде таңдауға болар еді. мысалы, var
қосылды автор Peter Lawrey, көзі
@MarkoTopolnik Бұл әзірлеушілерге түпкілікті емес айналымдарға түпкілікті айнымалы мәнді таңдауға немесе олар туралы ойлануға мәжбүрлеуге талпындырады.
қосылды автор Peter Lawrey, көзі

Section 14.20.3 of the Java Language Specification states it will only work with local variables.

Неліктен бұл? Менің болжауымша, белгілі бір тағайындау мен қашып кетуді тексереді (жергілікті айнымалы басқа әдіс ауқымына кірмейді). Өрісті класс кез келген жерде инициализациялауға болады. Менің болжауымша, бұл оның жергілікті айнымалы екенін дәлелдеу арқылы талдау жасау әлдеқайда қарапайым.

4
қосылды
Анықтама үшін рақмет!
қосылды автор ConcurrentHashMap, көзі

Java 9-мен олар айнымалы ресурстармен әрекеттесуді қолдады.

   //Original try-with-resources statement from JDK 7 or 8
    try (Resource r1 = resource1;
         Resource r2 = resource2) {
       //Use of resource1 and resource 2 through r1 and r2.
    }

   //New and improved try-with-resources statement in JDK 9
    try (resource1;
         resource2) {
       //Use of resource1 and resource 2.
    }

https://blogs.oracle. com/darcy/more-concise-try-with-resources-statements-in-jdk-9

1
қосылды

Алдымен, менің ойымша, бірнеше жерде қолданылатын ауыспалы/ресурс болуы жаман тәжірибе болады деп ойлаймын. Егер ол try ішінде ашылмаса, онда оны кейінірек жабуға болмайды, егер ол сонда ашылса, сізге жергілікті емес айнымалының қажеті болмайды. Бұл «екіншіге» әкеледі: Егер сізде ресурс ашылған болса, онда оны басқа жерде жауып қою керек, әйтпесе автоклоза ашық немесе жоқ екенін білмейді.

Мәселен, IMHO бұл ерекшеліктерде көрсетілгендей, оны өңдеуге мағынаны береді.

1
қосылды

Тілдік ерекшеліктерге сәйкес келуі мүмкін. Айнымалы екі жақша арасында жариялаған кезде, ол ішкі бөлікке еніп, сырттан қол жеткізе алмайды:

anything
{
int var;
}

// cannot access var from here!

Неліктен бұған тырысамыз?

0
қосылды