#java #class #oop
#java #класс #ооп
Вопрос:
У меня есть много классов, которые имеют один и тот же статический атрибут (staticAttr), и у меня есть другой класс, который принимает имя класса и обращается к его staticAttr указанного имени класса. Как я могу это сделать. Пожалуйста, помогите мне! Спасибо.
Редактировать:
public class Group_name1 extends Activity implements View.OnClickListener,
{
public static Group_name1 staticVar;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.group_name1);
staticVar = this;
}
}
public class Group_name2 extends Activity implements View.OnClickListener,
{
public static Group_name2 staticVar;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.group_name2);
staticVar = this;
}
}
Теперь моя проблема состоит в том, чтобы получить доступ к статической переменной этих классов в другом классе, просто указав строку имени класса. Теперь класс should можно использовать для получения staticVar, который содержит объект.
В настоящее время я создал отдельные классы для каждого класса, упомянутого выше, для ссылки на staticVar. Но я чувствую его избыточный и плохой стиль программирования, потому что каждый класс, который я пишу для ссылки на вышеупомянутые классы, выполняет ту же функцию. Единственное, что меняется, это ссылка на имя класса
Group_name1 grpActivity;
Group_name2 grpActivity;
Это мои текущие реализации. Но я хочу просто использовать имя класса для ссылки на статическую переменную
class GroupNameListener1 extends Thread
{
Group_name1 grpActivity;
public void run()
{
grpActivity = Group_name1.staticVar;
/*
do something
*/
}
}
class GroupNameListener2 extends Thread
{
Group_name2 grpActivity;
public void run()
{
grpActivity = Group_name2.staticVar;
/*
do something
*/
}
}
Комментарии:
1. Используйте отражение Luke docs.oracle.com/javase/tutorial/reflect
2. Вы можете использовать отражение, но это может привести к беспорядку. Почему бы не иметь общий интерфейс, который реализуется всеми вашими классами, с определенным статическим методом (а не статической переменной), который каждый класс может реализовать для возврата по мере необходимости.
3. Пожалуйста, проверьте мое редактирование.
Ответ №1:
Вот так :
ClassWithStaticVariable.VariableName
если у вас есть
class A {
public static String a = "test"
}
затем вы можете получить к ней доступ следующим образом :
class B {
public void test() {
System.out.println(A.a);
}
}
Ответ №2:
Если я правильно вас понимаю, у вас есть что-то вроде
class A {
public static String str = "test"
}
и в вашем коде у вас есть такой метод, как
void methodA (A someObj) {
в этом методе вы можете получить доступ к статической переменной
как
A.str
или
someObj.str
Комментарии:
1. @Vamshi синтаксис
someObj.str
, хотя и принят, не рекомендуется, поэтому предпочитайтеA.str
Ответ №3:
У вас очень плохой дизайн. За исключением отражения, нет способа решить эту проблему в общем виде, как вы ее разработали.
Я полагаю, что вы пытаетесь прикрепить метаданные к своим классам. Очень простой способ сделать это — сохранить глобальную карту, содержащую данные (и работать с классом вместо его имени):
public class MyClassMetaData {
private final static Map<Class<?>, String> dataMap = new HashMap<>();
static {
dataMap.put(MyClassA.class, "TestA"); // one method of initialization
dataMap.put(MyClass2.class, "Case2");
// one line per class...
}
private MyClassMetaData() {
}
public static String getMetaData(Class<?> theClass) {
return dataMap.get(theClass);
}
}
Но вам нужно не забыть добавить строку, которая помещает данные в карту в статический блок при добавлении другого класса.
Если вам нужно инициализировать данные динамически, доступ к карте может потребоваться синхронизировать.