2015-11-20 4 views
0

У меня есть ситуация, когда я хотел бы вернуть 2 значения из метода. Я пытаюсь понять, как это сделать на Java. В C# я бы просто использовал 2 параметра out или struct в этом случае, но не уверен, что лучше всего делать для Java (кроме пары, поскольку мне, возможно, придется изменить это на 3 значения или создать новый класс для возврата объекта).Метод Java для возврата нескольких значений

Мой пример таков:

public void myMethod(Signal signal){ 
    MyEnum enum = MyEnum.DEFAULT; 
    String country = ""; 

    // based on signal, I need to get 2 values, one is string, other is 
    // an enumeration 
    if (signal.getAction() == "Toyota"){ 
    enum = MyEnum.TOYOTA; 
    country = "Japan"; 
    } else if (signal.getAction() == "Honda"){ 
    enum = MyEnum.HONDA; 
    country = "Japan"; 
    } else if (signal.getAction() == "VW"){ 
    enum = MyEnum.VW; 
    country = "Germany"; 
    } else { 
    enum = MyEnum.DEFAULT; 
    country = "Domestic"; 
    } 

    // how to return both enum and country? 
    return ??? 
} 

Это просто пример, чтобы объяснить, что мне нужно (возвращение на одну-то, имеющий 2 значения, одна строка, другая представляет собой перечисление в данном случае). Поэтому, игнорируйте любые проблемы с моим сравнением строк или логикой, я хочу сказать, как вернуть что-то. Например, в C# я мог бы определить структуру и вернуть эту структуру, или я мог бы использовать параметры для возврата 2 значений. Но я не уверен, как это сделать на Java.

+6

Почему вы не хотите возвращать новый класс для марки и модели? Обратите внимание, что ваши тесты равенства строк не работают, вы вызываете 'car.getMake()' почти в каждом случае, и вам будет лучше иметь метод MyEnum.fromText' или что-то подобное ... –

+1

Out is not существуют в Java, но вы можете вернуть массив со значениями или создать значение вне метода и дать ему значение –

+0

@JonSkeet Спасибо Jon. Я хочу сказать, что мне нужно вернуть одно «что-то», состоящее из строки и значения перечисления. Таким образом, проверка строки не имеет значения. Кроме того, что касается возвращения объекта, я бы предпочел не потому, что мне нужно определить новый класс, а также обработать возвращаемый объект, например, очистить память, полученную этим объектом. – pixel

ответ

1

Я думаю, что это в основном пример того, что предложил Джон Скит. (отредактировано, чтобы включить страну)

Сделайте свой Enum перенос текста и функций преобразования.

public enum AutoMake { 
    HONDA("Honda", "Japan"), 
    TOYOTA("Toyota", "Japan"), 
    VW("Volkswagon", "Germany"); 

    private String country; 
    private String text; 

    private AutoMake(String text, String country) { 
     this.text = text; 
    } 

    public static AutoMake getMake(String str){ 
     AutoMake make = null; 
     AutoMake[] possible = AutoMake.values(); 
     for(AutoMake m : possible){ 
      if(m.getText().equals(str)){ 
        make = m; 
      break; 
      } 
     } 
     return make; 
    } 

    /** 
    * @return the country 
    */ 
    public String getCountry() { 
     return country; 
    } 

    /** 
    * @return the text 
    */ 
    public String getText() { 
     return text; 
    } 

} 

А затем сохранить марку как перечисление в объекте автомобиля

public class Car { 
    private AutoMake make; 
    private String model; 
    public Car() { 
    } 
    public Car(AutoMake make, String model) { 
     super(); 
     this.make = make; 
     this.model = model; 
    } 
    /** 
    * @return the make 
    */ 
    public AutoMake getMake() { 
     return make; 
    } 
    /** 
    * @return the model 
    */ 
    public String getModel() { 
     return model; 
    } 
    /** 
    * @param make the make to set 
    */ 
    public void setMake(AutoMake make) { 
     this.make = make; 
    } 
    /** 
    * @param model the model to set 
    */ 
    public void setModel(String model) { 
     this.model = model; 
    } 
} 

и теперь вы можете получить как текстовые, так и перечислений значения из объекта автомобиля

car.getMake() // Enum 
car.getMake.getText() // Text 
car.getMake.getCountry // Country 

Вы можете преобразование из текста в перечисление с

Enum make = AutoMake.getMake("Honda"); 

Это означает, что AutoMake.getMake(Signal.getAction()) может заменить myMethod(signal) с результирующим Enum, перевозящим как марку, так и страну.

+0

Очень ценили Иоанна и других. – pixel

0

Если вы действительно хотите иметь кортежи в java, вы можете импортировать их из стандартной библиотеки scala. Поскольку оба языка скомпилированы в один и тот же байтовый код, они могут использоваться вместе в одном проекте.

import scala.Tuple2; 

public class ScalaInJava { 
    public static Tuple2<String, Integer> tupleFunction(){ 
     return new Tuple2<>("Hello World", 1); 
    } 

    public static void main(String[] args) { 
     System.out.println(tupleFunction()._1()); 
    } 
} 
Смежные вопросы