Java firma de la función acepta un solo valor de enumeración

Bennett Hardwick:

Tengo una clase Java con múltiples valores "tipo", y una clase que puede tomar uno de esos tipos.

Estoy tratando de cambiar la implementación del constructor según la Typeenumeración utilizando sistema de tipos de Java, pero no puedo encontrar ninguna información sobre cómo hacerlo.

public enum Type {
    A,
    B,
    C
}

public class Action {
    public Action(Type.A type, String value) {}
    public Action(Type.B type, Float value) {}
    public Action(Type.C type, String value) {}
}

Es algo a este efecto posible en Java? Como es a máquina de escribir por ejemplo.

Ray Toal:

Parece que lo que usted está tratando de modelo es tres tipos relacionados

  • A, con un valor de cadena,
  • B, con un valor de coma flotante, y
  • C, con un valor de cadena.

Si es así, Java o menos quiere que hagas tres subclases, A, B, y C, de una clase base abstracta, porque, bueno, Java no realmente hacer tipos suma disjunta (también conocidos como tipos unión de la desunión, tipos de unión etiquetados) muy bien.

La información sobre cómo tener un solo tipo de "tags" (que es donde el nombre etiquetada unión o suma etiquetado viene) se discute en esta pregunta desbordamiento de pila . Puede ser que sea mejor que puedes ver esa pregunta en algún momento, ya que se ofrecen muchas ideas; la mayoría de los genéricos de uso.

En mi humilde opinión, Java nunca realmente una forma correcta de hacerlo tipos de suma. Java 8 opcionales introducidas, pero "sólo opcionales," tipos suma tan apropiados llevar algo de trabajo.

Así que mientras tanto, considerar soluciones alternativas al habitual de Java:

  • subclases (suspiro)
  • métodos de fábrica estáticos (ya que no se puede sobrecargar constructores con su enumeración: A, B, y C pertenecen al mismo tipo).

EDIT: Vea la gran respuesta por @ 9000, que muestra exactamente cómo poner en práctica los métodos de fábrica estáticas.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=177028&siteId=1
Recomendado
Clasificación