Si tengo un Employee clase con un constructor predeterminado:

private String firstName;
public Employee(){}

y un setter:

public void setFirstName(String firstName){
    this.firstName = firstName;
}

¿Por qué este intento de no crear y llamar a la incubadora en la misma línea?

Employee employee = new Employee().setFirstName("John");

OriginalEl autor Tigmal | 2011-06-13

7 Comentarios

  1. 24

    También puede utilizar esta sintaxis:

    Employee employee = new Employee() {{
        setFirstName("John");
    }};

    Aunque tenga en cuenta que esto va a crear una clase interna anónima y probablemente no es lo que usted desea.

    he mencionado es porque mucha gente no sabe acerca de esta sintaxis, y si bien es fácil para el abuso, sino que también viene en la mano cada tan a menudo. 😉

    OriginalEl autor stevevls

  2. 10

    Porque setFirstName no devuelve nada. Si desea cadena de métodos, a continuación, setFirstName tendría que volver Employee.

    Otro enfoque es tener un constructor que toma firstName como un argumento.

    OriginalEl autor Steve Kuo

  3. 3

    El método serFirstName es de tipo de retorno void (nada). Probar:

    public Employee setFirstName(String fname) {
      this.firstName = fname;
      return this;
    }

    OriginalEl autor Sorrow

  4. 3
    (employee = new Employee()).setFirstName("John");

    realiza la creación de instancias y llamar a la carta, como usted lo solicitó en el título, pero no de declarar la variable como se sugiere en el ejemplo de código.

    (Employee employee = new Employee()).setFirstName("John");

    probable que no funcione, supongo. Pero usted puede intentar.

    Por supuesto, usted puede siempre cosas varias instrucciones en una sola línea.

    Employee employee; (employee = new Employee()).setFirstName("John");

    o

    Employee employee = new Employee(); employee.setFirstName("John");

    Si yo fuera tú, me iría por un constructor parametrizado, aunque.

    OriginalEl autor T-Bull

  5. 2

    Debe ser como esto:

    Employee employee = new Employee();
    employee.setFirstName("John");
    La cuestión era cómo crear una instancia en la misma línea
    sí, pero hacerlo en una sola línea con un setter es de estilo pobre. La de arriba es más idiomática.
    Sólo utilice el Generador de patrón y hacer el setter devolver el objeto entero al final. Problema resuelto. Elegantemente.

    OriginalEl autor Eng.Fouad

  6. 1

    Porque el que desea establecer employee para el valor de .setFirstName("John"); que no devuelve nada porque es un void

    Por lo que podría cambiar tu setter:

    public Employee setFirstName(String fname) {
      this.firstName = fname;
      return this;
    }

    O Crear un segundo constructor para Employee

    public Employee(String fname){this.firstName = fname;}

    Que establece firstname en init.

    OriginalEl autor LouwHopley

  7. 1

    Aunque esto es un poco excesivo, puede intentar usar el el generador de patrón

    public class Employee{
        private String firstName;
    
        public static class Builder{
            private String firstName;
    
            public Builder firstName(String firstName){
                this.firstName = firstName;
                return this;
            }
    
            public Employee build(){
                return new Employee(this);
            }
        }
    
        private Employee(Builder builder){
            firstName = builder.firstName;
        }
    }

    A continuación, puede hacer lo siguiente

    Employee e = new Employee.Builder().firstName("John").build();
    ¿Por qué ir a pesar de los problemas cuando se puede simplemente devolver el this al final ov el setter? La obtendría una válida Employee e = new Employee().setFirstName("John");

    OriginalEl autor mre

Dejar respuesta

Please enter your comment!
Please enter your name here