如何在匿名 class 中更改实例变量
How to change instance variables inside anonymous class
我有一个 class UserName
是为了在提供用户 ID 时返回用户名而创建的。问题是我无法更改匿名 class ValueEventListener
中的实例变量 userName
。匿名 class 中的 Log.i()
函数成功打印了正确的用户名,但在通过 getUserName()
函数返回变量时它 returns 空字符串变量。如何在任何 anonymous classes 中更改此类 instance variables ?
public class UserName {
String userName;
public UserName(String userID){
DatabaseReference dbRefUsers = FirebaseDatabase.getInstance().getReference("Users");
Query queryGetUserName = dbRefUsers.orderByChild("userID").equalTo(userID);
queryGetUserName.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot dataSnapshotCurrent: dataSnapshot.getChildren()){
User userCurrent = dataSnapshotCurrent.getValue(User.class);
userName = userCurrent.getName();
Log.i("userName",userName);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public String getUserName() {
return userName;
}
}
如果您在 getUserName
AFTER 之后调用您的 onDataChange
方法,代码应该可以工作。
这是一个示例,说明它使用 JButton
和 ActionListener
public class UserName {
private String userName;
private JButton button = new JButton();
public UserName() {
button.addActionListener(e -> userName = "bob");
}
public String getUserName() {
return userName;
}
}
如果我这样做
UserName userName = new UserName();
System.out.println(userName.getUserName());
它打印空值。
但如果我这样做
UserName userName = new UserName();
userName.getButton().doClick();
System.out.println(userName.getUserName());
然后打印 "bob"
所以你的问题可能是:
- 您在
onDataChange
、 之前致电 getUserName
- 或者您的
onDataChange
方法没有设置值,因为它没有进入 if
语句,或者您的 dataSnapshot.getChildren()
是空的,
- 甚至最后 child 中用户的用户名是一个空字符串(请注意,您的代码始终 returns 最后 child 中的用户名是 inteded ?)
我有一个 class UserName
是为了在提供用户 ID 时返回用户名而创建的。问题是我无法更改匿名 class ValueEventListener
中的实例变量 userName
。匿名 class 中的 Log.i()
函数成功打印了正确的用户名,但在通过 getUserName()
函数返回变量时它 returns 空字符串变量。如何在任何 anonymous classes 中更改此类 instance variables ?
public class UserName {
String userName;
public UserName(String userID){
DatabaseReference dbRefUsers = FirebaseDatabase.getInstance().getReference("Users");
Query queryGetUserName = dbRefUsers.orderByChild("userID").equalTo(userID);
queryGetUserName.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot dataSnapshotCurrent: dataSnapshot.getChildren()){
User userCurrent = dataSnapshotCurrent.getValue(User.class);
userName = userCurrent.getName();
Log.i("userName",userName);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public String getUserName() {
return userName;
}
}
如果您在 getUserName
AFTER 之后调用您的 onDataChange
方法,代码应该可以工作。
这是一个示例,说明它使用 JButton
和 ActionListener
public class UserName {
private String userName;
private JButton button = new JButton();
public UserName() {
button.addActionListener(e -> userName = "bob");
}
public String getUserName() {
return userName;
}
}
如果我这样做
UserName userName = new UserName();
System.out.println(userName.getUserName());
它打印空值。
但如果我这样做
UserName userName = new UserName();
userName.getButton().doClick();
System.out.println(userName.getUserName());
然后打印 "bob"
所以你的问题可能是:
- 您在
onDataChange
、 之前致电 - 或者您的
onDataChange
方法没有设置值,因为它没有进入if
语句,或者您的dataSnapshot.getChildren()
是空的, - 甚至最后 child 中用户的用户名是一个空字符串(请注意,您的代码始终 returns 最后 child 中的用户名是 inteded ?)
getUserName