2013-02-14 2 views
-1

Это мой код.Доступ к переменной, объявленной внутри частного класса в java

private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {           
    String username = ""; 
    String sql = "select * from userinfo where uname=? and pword=?"; 
    try{ 
     pst = conn.prepareStatement(sql); 
     pst.setString(1, txt_username.getText()); 
     pst.setString(2, txt_password.getText()); 

     rs=pst.executeQuery(); 
     if(rs.next()){ 
      afterLogin pwcorrect = new afterLogin(); 
      pwcorrect.setVisible(true); 
      this.setVisible(false); 
      username = txt_username.getText(); 
     } 
     else{ 
      JOptionPane.showMessageDialog(null, "Username and Password are Incorrect."); 
     } 
    } 
    catch(Exception e){ 

     JOptionPane.showMessageDialog(null, e); 
    } 
} 

Мне нужно получить доступ к значению имени пользователя из другого класса. Есть ли способ для этого ??? Пожалуйста, помогите мне с кодом.

+1

Определите методы доступа к публике и используйте их. –

+3

Я вижу ** не ** частный класс в вашем коде, все, что я вижу, - это частный метод с именем локальной переменной. – PermGenError

+0

@PremGenError: Я сожалею об этом. Можете ли вы рассказать мне, как я могу получить доступ к этому имени локальной переменной из другого класса или другого метода в том же классе? и не могли бы вы дать код для этого. – user2068452

ответ

3

Это не только определено в классе, оно определено в методе в классе.

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

Поскольку это обработчик действий, вам также необходимо убедиться, что переменная будет доступна только после того, как она будет установлена, или что доступ к ней может иметь дело с ней не, имеющий значение.


public class WhateverClassThisIs { 

    private String username; 

    public String getUsername() { return username; } 

    private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {           
     String sql = "select * from userinfo where uname=? and pword=?"; 
     try { 
      // As before, but: 
      if (rs.next()) { 
       username = txt_username.getText(); 
      } 
     } 
    } 
} 

public class SomeOtherClass { 

    private WhateverClassThisIs theOtherClass; 

    public void setTheOtherClass(WhateverClassThisIs theOtherClass) { 
     this.theOtherClass = theOtherClass; 
    } 

    public void whatever() { 
     String username = theOtherClass.getUsername(); 
    } 
} 

Другой механизм мог бы рассчитывать на прохождение что-то, чтобы WhateverClassThisIs с именем пользователя сеттер, грубо:

public class WhateverClassThisIs { 

    private SomeOtherClass someOtherClass; 

    public WhateverClassThisIs(SomeOtherClass someOtherClass) { 
     this.someOtherClass = someOtherClass; 
    } 

    private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {           
     String sql = "select * from userinfo where uname=? and pword=?"; 
     try { 
      // As before, but: 
      if (rs.next()) { 
       someOtherClass.setUsername(txt_username.getText()); 
      } 
     } 
    } 
} 

public class SomeOtherClass { 

    private String username; 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void whatever() { 
     // Do something with username--but either try 
     // after you know it's been set, or by being 
     // able to handle it being null/empty/whatever 
    } 
} 

Кроме того, вы можете использовать Observer, любой из нескольких свинг-иш механизмы и т. д.

+0

«Выставляйте его публично с помощью getter или предоставляйте механизм, который код может установить на что-то еще». Можете ли вы объяснить это с помощью кодов. – user2068452

+0

@ user2068452 Я полагаю, хотя, надеюсь, это было очевидно в ретроспективе. Существует несколько других способов борьбы с подобной ситуацией, некоторые зависящие от Свинг, некоторые нет. –

0

Да, есть способы сделать это с помощью отражения ... если переменная является полем.

Но лучшим решением является изменение другого класса, так что он имеет доступные методы getter и/или setter ... после того, как вы продумали все последствия.

Прерывание инкапсуляции классов для доступа к частному государству - это то, что вы должны делать только в крайнем случае.


Если переменная является локальной переменной, то нет способа, чтобы какой-либо другой класс или метод могли ее обновить. И вы можете получить доступ к нему только из другого класса, если этот класс является локально объявленным анонимным внутренним классом, а переменная объявлена ​​как final. Это не похоже на то, что вы пытаетесь сделать здесь ...

+0

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

+0

Так что не ставьте его в локальную переменную !!! Поместите его в (закрытое) поле охватывающего класса и реализуйте метод getter. (Если вы зададите неправильный вопрос, вы не получите правильного ответа. Платит, чтобы попытаться выразить себя * четко * ...) –

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