如何从构造函数返回具有预设字段的新实例

时间:2015-05-07 18:58:08

标签: java constructor return-value

XHTML:

<p:carousel value="#{carouselView.cars}" var="car" itemStyleClass="carItem">
    <h:panelGrid columns="2" style="width:100%" cellpadding="5" columnClasses="label,value">
        <f:facet name="header">
            <p:graphicImage name="../images/cars/#{car.brand}.gif"/> 
        </f:facet>

        <h:outputText value="Id:" />
        <h:outputText value="#{car.id}" />

        <h:outputText value="Year" />
        <h:outputText value="#{car.year}" />

        <h:outputText value="Color:" />
        <h:outputText value="#{car.color}" style="color:#{car.color}"/>

Package1有1个java文件:
CarService.java

public class CarService {

    private final static String[] colors;

    private final static String[] brands;

    static {
        colors = new String[10];
        colors[0] = "Black";
        colors[1] = "White";
        colors[2] = "Green";
        colors[3] = "Red";

        brands = new String[10];
        brands[0] = "BMW";
        brands[1] = "Mercedes";
        brands[2] = "Volvo";
        brands[3] = "Audi";
     }
     public List<Car> createCars(int size) {
        List<Car> list = new ArrayList<Car>();
            list.add(new Car(getRandomId(), getRandomBrand(), getRandomYear());

        return list;
    }

    private String getRandomId() {
        return UUID.randomUUID().toString().substring(0, 8);
    }

    private int getRandomYear() {
        return (int) (Math.random() * 50 + 1960);
    }

    private String getRandomBrand() {
        return brands[(int) (Math.random() * 10)];
    }


    public List<String> getColors() {
        return Arrays.asList(colors);
    }

    public List<String> getBrands() {
        return Arrays.asList(brands);
    }
}

Package2有2个java文件:
1.CarouselView.java

public class CarouselView implements Serializable {
    private List<Car> cars;
    private Car selectedCar;
    private CarService service;
    @PostConstruct
    public void init() {
        cars = service.createCars(3);
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setService(CarService service) {
        this.service = service;
    }

    public Car getSelectedCar() {
        return selectedCar;
    }

    public void setSelectedCar(Car selectedCar) {
        this.selectedCar = selectedCar;
    }
}

2.Car.java

public class Car {

    String randomId;
    String randomBrand;
    int randomYear;
    public Car(String randomId, String randomBrand, int randomYear) {
        this.randomId = randomId;
        this.randomBrand = randomBrand;
        this.randomYear = randomYear;
    }
}

我收到错误,

Caused by: java.lang.NullPointerException at com.abc.mmc.dto.CarouselView.init(CarouselView.java:35)

5 个答案:

答案 0 :(得分:1)

构造函数不应返回任何内容。对于典型的POJO's(非常普通的Java对象),目标是使用指定的参数创建(或构造)对象。

例如:

public class Car {
    private String randomId;
    private String randomBrand;
    private String randomYear;

    public Car(String randomId, String randomBrand, int randomYear) {
        this.randomId = randomId; 
        this.randomBrand = randomBrand;
        this.randomYear = randomYear;
    } 

    //Getters and Setters follow
}

this.randomId = randomId;您接受参数randomId并将其分配给类变量this.randomId

这是常见的惯例。这是一个备用代码片段来详细说明意图(尽管先前是首选,假设您的变量名称很好):

private String carId;
private String carBrand;
private int carYear;

public Car(String randomId, String randomBrand, int randomYear){
   carId = randomId;
   carBrand = randomBrand;
   carYear = randomYear;
}

如果你将参数传递给方法的构造函数而不对它们做任何事情,那就浪费时间了。你只是建造裸体物体。接收传入参数并使用这些项“设计”Car对象非常重要。

编辑以下OP更新:

您在service.createCars(3);上收到NullPointerException,因为您没有初始化CarService对象:

private Car selectedCar;
private CarService service;
@PostConstruct
public void init() {
    service = new CarService(); //Create your service object
    cars = service.createCars(3);
}

答案 1 :(得分:1)

构造函数不返回任何内容。 您可能希望在构造函数中从参数到对象中设置一些值。 类似的东西:

public class Car {
    private String randomId;
    private String randomBrand;
    private int randomYear;
    public Car(String randomId, String randomBrand, int randomYear) {
        this.randomId = randomId;
        this.randomBrand = randomBrand;
        this.randomYear = randomYear;
    }
}

答案 2 :(得分:1)

构造函数永远不会有返回类型,即使不能返回类型void,构造函数名称也必须与类名相似。但构造函数可能是privatepublic -

private Car(); //or
public Car();  

从您的问题描述中,您似乎需要添加一些getter / setter方法来访问private类中的Car字段。

要使用构造函数正确工作,您不需要从中添加return语句。任何创建Car实例/对象的类都可以使用 new 运算符以及公共构造函数 -

//In some class that need an instance/object
//of Car class
Car aCar = new Car(... //arguments list);

注意:此处 Car() 是公共构造函数,它没有返回类型。在上面的陈述中发生了一些事情 -
1。 JVM使用公共构造函数Car()创建新的实例/对象 2。新创建的Car类型对象分配了Car类型引用变量 - aCar。

答案 3 :(得分:0)

你不需要退货。构造函数没有回报。它使用初始化。

答案 4 :(得分:0)

在这样一个简单的构造函数中,我根本不会返回任何值。由于更复杂,尤其依赖于外部源,我可能会为构造成功或失败添加一个布尔值。