Java: как вернуть другой объект / тип данных на основе значения

#java

#java

Вопрос:

Java: необходимо вернуть несколько объектов на основе заданного значения.

NewClass tes = new NewClass();

Object[][] obj ={{}};

Пример: если браузер chrome возвращает TestClass, а его браузер IE возвращает Obj

 public <T extends Object> T getValue(String browser){

switch(browser):
case "Chrome": return tes;
case "IE": return obj;

}
  

В Java возможно ли возвращать разные типы объектов в одном методе.

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

Комментарии:

1. В Java вы можете возвращать только объект с определенным типом. Таким образом, единственный способ вернуть несколько типов — это если все типы, которые вы хотите вернуть, являются подклассами определенного возвращаемого типа рассматриваемого метода. Конечно, Object это тот тип, который позволит вам возвращать практически все, но он практически ничего не говорит о том, что возвращается. Но, может быть, это нормально. В любом случае вам придется тестировать каждый возможный тип, поэтому просто верните объект, а затем используйте instanceof для тестирования различных возможностей возврата.

2. Просто заметил, что вы используете общий тип в вашем примере. Это не сработает. Это будет работать только в том случае, если вы хотите иметь ряд методов, каждый из которых возвращал только один тип объекта. Здесь вы хотите возвращать разные типы из одного и того же метода. Дженерики вам в этом не помогут. Пусть ваш getValue метод просто вернет объект.

Ответ №1:

Я рекомендую вам взглянуть на шаблон проектирования Factory. Вы будете создавать объекты, не раскрывая логику создания.

Это моя интерпретация. Я не знаю, хотите ли вы это реализовать.

 
public enum BrowserType {
    CHROME, SAFARI, IE
}

//Browser is the parent class of all browser instances and it will also contain the common logic applicable for creating all types
public abstract class Browser {

    public Browser(BrowserType model) {
        this.model = model;
        arrangeParts();
    }

    private void arrangeParts() {
        // Do one-time processing here
    }

    // Do subclass level processing in this method
    protected abstract void construct();

    private BrowserType model = null;

    public BrowserType getModel() {
        return model;
    }

    public void setModel(BrowserType model) {
        this.model = model;
    }
}

//    Safari is a concrete implementation of Browser type SAFARI
public class Safari extends Browser {

    Safari() {
        super(BrowserType.SAFARI);
        construct();
    }

    @Override
    protected void construct() {
        System.out.println("SAFARI BROWSER LOADED");
        // add accessories
    }
}

//    IE is concrete implementation of Browser type IE
public class IE extends Browser {

    IE() {
        super(BrowserType.IE);
        construct();
    }

    @Override
    protected void construct() {
        System.out.println("IE BROWSER LOADED");
        // add accessories
    }
}

//BrowserFactory.java is our main class implemented using factory pattern. It instantiates a browser instance only after determining its type.
public class BrowserFactory {
    public static Browser buildBrowser(BrowserType model) {
        Browser browser = null;
        switch (model) {
            case IE:
                browser = new IE();
                break;

            case SAFARI:
                browser = new Safari();
                break;

            case CHROME:
                browser = new Chrome();
                break;

            default:
                // throw some exception
                break;
        }
        return browser;
    }
}
  

Комментарии:

1. Это не имеет абсолютно никакого отношения к вопросу.

2. Тогда я не понял вашего вопроса.