Class Elvis
?:
.
For the expression "A ?: B
", if A
is neither null
,
an empty Optional
, nor an empty String
, the value of the
expression is A
, or A.get()
for an Optional
. If
A
is null
, an empty Optional
, or an
empty String
, the value of the expression is B
.
- Since:
- 3.0
- Author:
- Andy Clement, Juergen Hoeller, Sam Brannen
-
Field Summary
Fields inherited from class org.springframework.expression.spel.ast.SpelNodeImpl
children, exitTypeDescriptor
Fields inherited from interface org.springframework.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V9
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
generateCode
(MethodVisitor mv, CodeFlow cf) Generate the bytecode for this node into the suppliedMethodVisitor
.getValueInternal
(ExpressionState state) boolean
Determine if this node can be compiled to bytecode.Return the string form of this AST node.Methods inherited from class org.springframework.expression.spel.ast.SpelNodeImpl
generateCodeForArgument, generateCodeForArguments, generateCodeForArguments, getChild, getChildCount, getEndPosition, getExitDescriptor, getObjectClass, getStartPosition, getTypedValue, getValue, getValue, getValueRef, isNullSafe, isWritable, nextChildIs, setValue, setValueInternal
-
Constructor Details
-
Elvis
-
-
Method Details
-
getValueInternal
If the left-hand operand is neither neithernull
, an emptyOptional
, nor an emptyString
, return its value, or the value contained in theOptional
. If the left-hand operand isnull
, an emptyOptional
, or an emptyString
, return the other value.- Specified by:
getValueInternal
in classSpelNodeImpl
- Parameters:
state
- the expression state- Throws:
EvaluationException
- if the null/empty check does not evaluate correctly or there is a problem evaluating the alternative
-
toStringAST
Description copied from interface:SpelNode
Return the string form of this AST node.- Returns:
- the string form
-
isCompilable
public boolean isCompilable()Description copied from interface:SpelNode
Determine if this node can be compiled to bytecode.The reasoning in each node may be different but will typically involve checking whether the exit type descriptor of the node is known and any relevant child nodes are compilable.
The default implementation returns
false
.If you override this method, you must also override
SpelNode.generateCode(MethodVisitor, CodeFlow)
.- Returns:
true
if this node can be compiled to bytecode- See Also:
-
generateCode
Description copied from interface:SpelNode
Generate the bytecode for this node into the suppliedMethodVisitor
.Context information about the current expression being compiled is available in the supplied
CodeFlow
object — for example, information about the type of the object currently on the stack.This method will not be invoked unless
SpelNode.isCompilable()
returnstrue
.The default implementation throws an
IllegalStateException
sinceSpelNode.isCompilable()
returnsfalse
by default.If you override this method, you must also override
SpelNode.isCompilable()
.- Parameters:
mv
- the ASMMethodVisitor
into which code should be generatedcf
- a context object with information about what is on the stack- See Also:
-