web-dev-qa-db-ja.com

groovyでのこのメソッドの戻り型は何でしょうか?

私はこのような方法を持っています:

def getInformation ()  {

  return [true, "reason why"]
}

私はこのように使っています

def (isClear, reason) = getInformation()

このメソッドの戻り値の型を定義する方法はあるので、誰かがメソッドを通過するときに読む方が良いでしょうか?

16
Anthony

このメソッドの実際の戻り値の型はObjectです。これは、 'def'を使用して宣言したためです。つまり、実際に返すオブジェクトに関係なく、何でも返すことができます。

次のコードも同様に有効です。

def getInformation ()  {    
  return "this is some information"
}

または

def getInformation ()  {    
  return 42
}

ただし、メソッドのreturntypeは変更されていません。

ここでの本当の問題は、なぜそのようなアプローチを選ぶのかということです。私の意見では、次のようにするとより明確になります。

Result getInformation() {
     return new Result(success: true, reason: "why")
}

これにより、呼び出し元はより明確になり、作成する必要があるのは簡単なクラスだけです。

class Result {
     boolean success
     String reason
}

これでAPIが明確に定義されました。ここで直面している問題のため、メソッドシグネチャでdefを使用することはありません。

28
Erik Pragt

戻り値の型はリスト、より正確にはブール型の2つの要素を持つArrayList、文字列になります。

また、ジェネリックリストは単一の型(この場合はオブジェクト)にしかできないため、複数の戻り値の型を定義する方法はありません。

8
fabiangebert

アンソニー、あなたの場合はマップを返すほうがよい[isClear:true, reason:"reason why"]。次に、コードで値を取得します。

Map getInformation ()  {
  return [isClear:true, reason:"reason why"]
}
...
def result =  getInformation ()
if(result.isClear){
   ...
   result.reason
   ...
}
6
Mr. Cat

このメソッドの戻り値の型を定義する方法はあるので、誰かがメソッドを通過するときに読む方が良いでしょうか?

実際には、これを次のように変更できますが、それほど良くはありません。

List getInformation ()  {
  return [true, "reason why"]
}

ただし、戻り値が割り当てられる変数のタイプを定義できるため、コードのその部分が読みやすくなります。

def getInformation ()  {    
  return [true, "reason why"]
}

def (boolean isClear, String reason) = getInformation()    
5
Dónal