Java: объект доступа к классу, созданному внутри switch

#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, и вы вызываете метод по ссылке на класс объекта .