#java #class #object #switch-statement #case
#java #класс #объект #switch-инструкция #случай
Вопрос:
У меня есть сценарий, подобный приведенному ниже :
String artifactName="testplan"; //or at times "testsuite" can come
switch (artifactName) {
case testplan: {
TestPlan artifact = new TestPlan();
}
case testsuite: {
TestSuite artifact = new TestSuite();
}
Исходя из вышесказанного, я хочу получить объект артефакта вне коммутатора.
В обоих классах (TestSuite и TestPlan) у меня есть атрибут, который я бы устанавливал по мере получения артефакта и соответствующего использования объекта. Если быть точным, я буду использовать это для преобразования этого объекта в xml (xml варьируется в зависимости от класса). Как мне извлечь артефакт из switch? Как мне получить объект, когда класс меняется внутри switch case.
Пожалуйста, помогите мне как можно скорее.
Комментарии:
1. Вы могли бы просто объявить
artifact
вне коммутатора какObject artifact
2. Да. Понял!!!
Ответ №1:
Возможно, вы также можете выполнить следующее:
String artifactName="testplan";
Object artifact;//create reference
switch (artifactName) {
case testplan: {
artifact = new TestPlan();//assing it here
break;
}
case testsuite: {
artifact = new TestSuite();//or here
break;
}
Итак, вам нужно работать непосредственно с экземпляром одного из ваших классов. Вы знаете. Я вообще новичок в Java. И если кто-то предоставит лучшую идею для этого, это будет хорошо. Но пока я вижу единственное решение.
if(object instanceof TestPlan){
((TestPlan) object).doMethod();
}else if (object instanceof TestSuite){
((TestSuite)object).doMethod();
}
Но имейте в виду, что если не было выполнено ни одного случая переключения, он все равно будет равен null.
Комментарии:
1. Спасибо за ответ. Но после выполнения switch у меня будет artifact.setCustomAttribute(«sdfsdf»). Этот метод setCustomAttribute существует как для класса / объекта testplan, так и для testsuite. Когда я пытаюсь использовать предложенный выше способ, я получаю сообщение типа «Метод setCustomAttribute (RQMCustomAttributes) не определен для типа Object». Пожалуйста, помогите мне.
2. Я отредактировал свой ответ для вас
Ответ №2:
Создайте ссылочный «артефакт» типа TestPlan (TestSuite расширяет TestPlan) вне блока switch, а затем внутри инструкций case назначьте объект (TestPlan / TestSuite) в соответствии с вашим требуемым условием. Приведенный ниже код работает нормально.
Если вы хотите использовать общий метод, который доступен в обоих классах, и использовать концепцию наследования и полиморфизма. Вы можете расширить TestPlan (родительский) в TestSuite (дочерний) и вместо ссылки на объект вы можете использовать ссылку на TestPlan.
String artifactName="testplan";
TestPlan artifact;// Test Plan is the Parent class and extend it to TestSuite
switch (artifactName) {
case "testvplan": {
artifact = new TestPlan();
break;
}
case "testsuite": {
artifact = new TestSuite();
break;
}
default : {
//some code for default condition
}
}
Комментарии:
1. Спасибо за ответ. Но после выполнения switch у меня будет artifact.setCustomAttribute(«sdfsdf»). Этот метод setCustomAttribute существует как для класса / объекта testplan, так и для testsuite. Когда я пытаюсь использовать предложенный выше способ, я получаю сообщение типа «Метод setCustomAttribute (RQMCustomAttributes) не определен для типа Object». Пожалуйста, помогите мне.
2. Это потому, что setCustomAttribute(строка) не определен в классе object, и вы вызываете метод по ссылке на класс объекта .