2014-01-02 4 views
0

Я новичок в мире java, и я пытался найти ответ на этот вопрос и не мог. Так может кто-нибудь объяснить, как я могу использовать уже инициализированную String извне потока. Вот код, который я хочу использовать, это «имя», но если я сделаю «имя» окончательным, я не могу установить для него значение.Доступ к строке из-за пределов темы

public class Users { 

    public static void GenerateNames() { 

     String name = ""; 
     String str; 
     for (int i = 0; i <= 2; i++) 

      name = name + RandNames.GenerateRandomChar(); 

     str = name; 

     Hashtable ht = new Hashtable(); 

     if (ht.get(str) == null) 
     { 
      ht.put(str, name); 
     } 
     else { 

     } 

     Runnable r = new Runnable() { 
      public void run() { 

       int Anketa = (int) (1 + Math.random() * 6); 

       Hashtable voting = new Hashtable(); 

       if (voting.get(name) == null) 
       { 

       } 
      } 
     }; 
     new Thread(r).start(); 
    } 
} 

Также есть проблема, что я оставил «еще» пустым. Мне просто нужно ничего не делать.

ответ

2

Просто переместите код, который генерирует name в отдельный метод:

public static String GenerateRandomName() { 
    StringBuilder name = new StringBuilder(); 
    for (int i = 0; i <= 2; i++) { 
     name.append(RandNames.GenerateRandomChar()); 
    } 
    return name.toString(); 
} 

В общем, вы будете иметь возможность сделать name окончательный:

public static void GenerateNames() { 
    final String name = GenerateRandomName(); 
    ... 
} 

также есть проблема, которую я left "else" пуст. Мне просто нужно ничего не делать.

Просто опускаем его полностью:

if (ht.get(str) == null) 
{ 
    ht.put(str, name); 
} 
0

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

public class Users { 

private static String name = ""; 

public static void GenerateNames() { 

    // your code 

    Runnable r = new Runnable() { 
     public void run() { 
      int Anketa = (int) (1 + Math.random() * 6); 
      Hashtable voting = new Hashtable(); 
      if (voting.get(name) == null) { 

      } 
     } 
    }; 
    new Thread(r).start(); 
} 

}

0

Один из способов решить такого рода проблемы заключается в использовании второй локальной переменной:

public static void GenerateNames() { 

    String workName = ""; // you can probably think of a better variable name 
    for (int i = 0; i <= 2; i++) 
     workName = workName + RandNames.GenerateRandomChar(); 

    final String name = workName; 

и теперь вы можете использовать name в вашем анонимного внутреннего класса. (Это шаблон, который я использую довольно часто.)

Смежные вопросы