2014-01-08 2 views
1

У меня есть этот простой клиент ldap, который использует устаревшую коллекцию Hashtable.Замените устаревшую коллекцию `Hashtable`

class SAuth { 

    public static void main(String[] args) { 

     Hashtable env = new Hashtable(11); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, 
       "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, "ldap://xx.xx.xx.xx:yyyy/"); 

     // Authenticate as S. User and password "mysecret" 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, "cn=orcladmin"); 
     env.put(Context.SECURITY_CREDENTIALS, "password"); 

     try { 

      DirContext ctx = new InitialDirContext(env); 
      System.out.println(" i guess the connection is sucessfull :)"); 

     // Do something useful with ctx 
      // Close the context when we're done 
      ctx.close(); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

Есть ли какая-нибудь современная коллекция, которую я могу использовать, не нарушая код вместо Hashtable?

Update:

class tSAuth { 

    public static void main(String[] args) { 

     Map<String, String> env = new HashMap<String, String>(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, 
       "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, "ldap://xx.xx.xx.xx:yyyy/"); 

     // Authenticate as S. User and password "mysecret" 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, "cn=orcladmin"); 
     env.put(Context.SECURITY_CREDENTIALS, "password"); 

     try { 

      DirContext ctx = new InitialDirContext((Hashtable<?, ?>) env); 
      System.out.println(" i guess the connection is sucessfull :)"); 

     // Do something useful with ctx 
      // Close the context when we're done 
      ctx.close(); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
+4

Единственный раз, когда вы должны использовать устаревшие классы, - это когда у вас есть API, который его требует. В этом случае вы должны передать Hashtable. –

+1

Вместо этого вы можете использовать объект Properties. Класс Properties не считается устаревшим. Свойства расширяют HashTable, поэтому его можно передать в конструктор InitialDirContext. (Конечно, это не означает, что вы действительно избегаете использования HashTable, но, по крайней мере, ваш код не будет напрямую использовать устаревший класс.) – VGR

ответ

3

Использование HashMap вместо HashTable так:

Map env = new HashMap(); 

Я не уверен, что точный тип Context.*, однако, если это String, то вы можете написать код выглядит следующим образом:

Map<String, String> env = new HashMap<String, String>(); 

EDIT:

параметр типа The InitialDirContext конструктора является Hashtable<?,?>. Поэтому в этом случае вы должны Hashtable. Может быть, вы можете написать так:

Hashtable<String, String> env = new Hashtable<String, String>(); 
+3

Остерегайтесь побочных эффектов: «Hashtable» синхронизируется по умолчанию, а 'HashMap' - нет. Если код использует потоки, может быть целесообразным использовать «Collections.synchronizedMap» для добавления синхронизации. – Darkhogg

+0

Или что-то сделано для параллелизма, например ['ConcurrentHashMap'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html) – zapl

+0

Я обновил код, но я использую Object бросать. Как я могу сделать код чистым без броска? –

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