Java: условная инициализация? - PullRequest
3 голосов
/ 30 апреля 2010

Ruby имеет условную инициализацию. Видимо, Java не делает или делает это? Я стараюсь писать более кратко, чтобы ограничить диапазон как можно меньше.

import java.io.*;
import java.util.*;

public class InitFor{

        public static void main(String[] args){
                for(int i=7,k=999;i+((String h="hello").size())<10;i++){}

                System.out.println("It should be: hello = "+h);

        }
}

Ошибка

Press ENTER or type command to continue
InitFor.java:8: ')' expected
  for(int i=7,k=999;i+((String h="hello").size())<10;i++){}
                              ^

Загадка

  1. Можно ли присвоить значение объявленному значению в цикле while? ДА code1
  2. Назначение в цикле for условно? ДА code2
  3. условный init NO
  4. Можете ли вы назначать разные типы значений в циклах? ДА в ответ
  5. Какое-то правило для инициализации внутри циклов? Объявите снаружи для доступа к значениям позже, как насчет init? (?)

1. CODE

import java.io.*;
import java.util.*;

public class InitFor{
        public static void main(String[] args){
                int k=5;
                while((k=(k%3)+1)!=1){
                        System.out.println(k);
                }
                //PRINTs only 3
        }
}

2. CODE

import java.io.*;
import java.util.*;

public class InitFor{

        public static void main(String[] args){
                int k=5;
                for(;(k=(k%3)+1)!=1;){
                        System.out.println(k);
                }
                //PRINTs only 3
                System.out.println(k); 
                // WHY DOES IT PRINT 1? Assign in for-loop!
        }
}

Часть исходной проблемы со многими различными типами назначений и инициализаций - 100 строк кода в одну строку

for(int t=0,size=(File[] fs=((File f=f.getParentFile()).listFiles(filt))).size();fs==null;t++){if(t>maxDepth){throw new Exception("No dir to read");}}

Ответы [ 4 ]

5 голосов
/ 30 апреля 2010

Проблема в том, что переменная не может быть там объявлена; переменные могут быть объявлены внутри блока, но не могут быть объявлены как часть выражения. Однако вы можете выделить объекты в выражении:

for(int i=7,k=999;i+((new String("hello")).length())<10;i++){}

Для вашей программы следующее имеет смысл:

public static void main(String[] args){
    String h = "hello";
    for(int i=7,k=999;(i+h.length())<10;i++){} // not sure what this is doing
    System.out.println("It should be: hello = "+h);
}

Я бы также добавил, что даже если бы объявление было разрешено там, где оно было у вас, переменная принадлежала бы области действия цикла for, и поэтому переменная больше не была бы видимой после цикла (вне области действия) .

2 голосов
/ 30 апреля 2010

Объявления переменных не могут быть частями выражений, они являются утверждениями, как сказано в спецификации Java .

Если в Java существовала условная инициализация, то как определить, инициализирована ли переменная? Как правильно скомпилировать код? (вам нужно понять, как работает компилятор Java, чтобы знать, что это невозможно) Как обрабатываются ошибки? Есть много осложнений. В вашем коде, даже если переменная инициализирована, она исчезнет после блока for из-за стратегии видимости Java.

1 голос
/ 30 апреля 2010

Я думаю, вы путаете назначение с декларацией.Вы можете сделать

public static void main(String[] args){
    String h = null;
    for(int i=7,k=999;i+((h="hello").size())<10;i++){}

    System.out.println("It should be: hello = "+h);
}

Оператор = является ассоциативным справа и устанавливает первый аргумент во второй аргумент и вычисляет первый аргумент, поэтому что-то вроде

a = b = c = 4

являетсятакой же как

(a = (b = (c = 4)))

, который устанавливает c в 4, b в c (теперь 4) и a в b (теперь также 4)

ваша строка кода может быть (переформатирована для ясности)

File[] fs=null;                                                                            
File f= ??? ; //you never initialize f in the for loop, you need a starting value  
int t, size;                                                                               

for (t=0,size=(fs=((f=f.getParentFile()).listFiles(filt))).size();      
     fs==null;                                                                             
     t++) {
       if(t>maxDepth) {throw new Exception("No dir to read");}
     }
}

РЕДАКТИРОВАТЬ - (хотя это действительно ужасный код, и если вы отметите его в моем проекте, я скажу вам переписать его как можно скорее)

0 голосов
/ 19 февраля 2016

Условная инициализация Java:

variable = (condition ? expression1 : expression2);

Например:

int max = (faces.length>curves.length ? faces.length : curves.length);
...