Java 使用两个不同的构造函数创建单个对象
我有一个Card类,它包含两个构造器,你可以在下面的代码中看到。问题是每个Card对象包含两个字符串和两个图像,因为我想保存这些对象,所以我必须将图像的路径保存为字符串,然后检索它们,因此这两个构造器。然而,使用一些print语句,我发现每当检索到一张卡时,就会创建两个独立的对象:一个普通对象和另一个空对象。我知道这是因为我在第二张卡中使用第一个构造器创建了一张新卡。有没有一种方法可以避免这种情况,这样我就不会有两个单独的对象?如果可能的话,我想找到一种只使用一个构造函数的方法。以下是我的类: Card.java:Java 使用两个不同的构造函数创建单个对象,java,object,javafx,constructor,save,Java,Object,Javafx,Constructor,Save,我有一个Card类,它包含两个构造器,你可以在下面的代码中看到。问题是每个Card对象包含两个字符串和两个图像,因为我想保存这些对象,所以我必须将图像的路径保存为字符串,然后检索它们,因此这两个构造器。然而,使用一些print语句,我发现每当检索到一张卡时,就会创建两个独立的对象:一个普通对象和另一个空对象。我知道这是因为我在第二张卡中使用第一个构造器创建了一张新卡。有没有一种方法可以避免这种情况,这样我就不会有两个单独的对象?如果可能的话,我想找到一种只使用一个构造函数的方法。以下是我的类:
package com.spdesigns.dokkancardspreview.model;
import javafx.scene.image.Image;
public class Card {
private String mName;
private String mDescription;
private Image mMainImage;
private Image mSecondaryImage;
private String mMainImagePath;
private String mSecondaryImagePath;
public Card(String name, String description, Image mainImage, Image secondaryImage) {
mName = name;
mDescription = description;
mMainImage = mainImage;
mSecondaryImage = secondaryImage;
}
public Card(String name, String description , String mainImagePath, String secondaryImagePath) {
Card newCardToAdd = new Card(name,description,new Image(mainImagePath),new Image(secondaryImagePath));
}
@Override
public String toString() {
return mName + " | " + mDescription;
}
public Image getmMainImage() {
return mMainImage;
}
public Image getmSecondaryImage() {
return mSecondaryImage;
}
public String getName() {
return mName;
}
public String getDescription() {
return mDescription;
}
}
home.java:
package com.spdesigns.dokkancardspreview.controllers;
import com.spdesigns.dokkancardspreview.model.Card;
import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.io.*;
import java.util.List;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
public class home implements Initializable {
private Card hit = new Card("Hit","Expanding Possibility",
new Image("/images/hit_main.jpg") , new Image("/images/hit_secondary.jpg"));
private Card goku = new Card("Goku SSJ3","Everlasting legend",
new Image("/images/gokussj3_main.jpg") , new Image("/images/gokussj3_secondary.jpg"));
private boolean clickedAgain = false;
@FXML
private Button arrowButton;
@FXML
private ImageView imageView;
@FXML
private ImageView arrow;
@FXML
private ListView listView;
protected List<Card> testingList = new ArrayList<Card>();
protected ListProperty<Card> listProperty = new SimpleListProperty<Card>();
@Override
public void initialize(URL location, ResourceBundle resources) {
addCard(hit);
addCard(goku);
//testingList.add("test2");
listView.itemsProperty().bind(listProperty);
// wrapping our list in an observable list and then pass that observableList to the ListProperty isntance
listProperty.set(FXCollections.observableArrayList(testingList));
// Handle listView selection changes
listView.getSelectionModel().selectedItemProperty().addListener(((observable, oldValue, newValue) -> {
Card currentlySelectedCard = listProperty.get(listView.getSelectionModel().getSelectedIndex());
System.out.printf("ListView item clicked! Value retrieved: %s\n", currentlySelectedCard);
imageView.setImage(new Image(currentlySelectedCard.getmMainImage().impl_getUrl()));
arrow.setVisible(true);
arrowButton.setVisible(true);
}));
arrow.translateYProperty().set(283f);
arrowButton.translateYProperty().set(283f);
arrow.setRotate(180);
arrow.setVisible(false);
arrowButton.setVisible(false);
}
public void handleShowDetails(ActionEvent actionEvent) {
System.out.println("Button Clicked!");
Card currentlySelectedCard = listProperty.get(listView.getSelectionModel().getSelectedIndex());
if(clickedAgain) {
imageView.setImage(new Image(currentlySelectedCard.getmMainImage().impl_getUrl()));
arrow.setRotate(180);
clickedAgain = false;
} else {
imageView.setImage(new Image(currentlySelectedCard.getmSecondaryImage().impl_getUrl()));
arrow.setRotate(360);
clickedAgain = true;
}
}
// Saving
public void exportTo(String fileName) {
try(
FileOutputStream fos = new FileOutputStream(fileName);
PrintWriter writer = new PrintWriter(fos);
){
for(int i =0;i<testingList.size()-1;i++) {
writer.printf("%s|%s|%s|%s\n",testingList.get(i).getName(),testingList.get(i).getDescription(),
testingList.get(i).getmMainImage().impl_getUrl(),testingList.get(i).getmSecondaryImage().impl_getUrl());
System.out.println(testingList.get(i).toString());
}
} catch (IOException ioe) {
System.out.printf("Problem saving: %s/n", fileName);
ioe.printStackTrace();
}
}
// Loading
public void importFrom(String fileName) {
try(
FileInputStream fis = new FileInputStream(fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
){
String line;
while((line = reader.readLine()) != null) {
String[] args = line.split("\\|");
this.addCard(new Card(args[0],args[1],args[2],args[3]));
}
} catch (IOException ioe) {
System.out.printf("Problem loading: %S\n" , fileName);
ioe.printStackTrace();
}
int i = 0;
for (Card card : testingList) {
System.out.printf("%s loaded\n",testingList.get(i).toString());
i++;
}
System.out.println("Loading Successful!");
}
public void addCard(Card card) {
testingList.add(card);
}
// DEBUG purposes
public void printTestingList() {
for (Card card : testingList) {
System.out.println(card.toString());
}
}
}
改变
到
此构造函数中存在代码问题:
public Card(String name, String description , String mainImagePath, String secondaryImagePath) {
Card newCardToAdd = new Card(name,description,new Image(mainImagePath),new Image(secondaryImagePath));
}
如您所见,您在其中创建了一张新卡newCardToAdd,使新实例完全错误初始化
在这种情况下,您要做的是从另一个构造函数调用一个构造函数。。。在您的情况下,您的两个协构造函数应该如下所示:
public Card(String name, String description, Image mainImage, Image secondaryImage) {
mName = name;
mDescription = description;
mMainImage = mainImage;
mSecondaryImage = secondaryImage;
}
public Card(String name, String description, String mainImagePath, String secondaryImagePath) {
this(name, description, new Image(mainImagePath), new Image(secondaryImagePath));
}
如果您不需要将
Image
s直接传递给类(仅图像路径),那么一个构造函数就足够了:
public Card(String name, String description,
String mainImagePath, String secondaryImagePath) {
mName = name;
mDescription = description;
mMainImagePath = mainImagePath;
mSecondaryImagePath = secondaryImagePath;
mMainImage = new Image(mainImagePath);
mSecondaryImage = new Image(secondaryImagePath);
}
请注意,此解决方案使
mMainImagePath
和mSecondaryImagePath
字段未初始化。@Mick助记符是的,但这些字段是私有的且不可访问,可能应该删除这些字段,或者如果要使用它们,它们应该有一个getter?
public Card(String name, String description , String mainImagePath, String secondaryImagePath) {
Card newCardToAdd = new Card(name,description,new Image(mainImagePath),new Image(secondaryImagePath));
}
public Card(String name, String description, Image mainImage, Image secondaryImage) {
mName = name;
mDescription = description;
mMainImage = mainImage;
mSecondaryImage = secondaryImage;
}
public Card(String name, String description, String mainImagePath, String secondaryImagePath) {
this(name, description, new Image(mainImagePath), new Image(secondaryImagePath));
}
public Card(String name, String description,
String mainImagePath, String secondaryImagePath) {
mName = name;
mDescription = description;
mMainImagePath = mainImagePath;
mSecondaryImagePath = secondaryImagePath;
mMainImage = new Image(mainImagePath);
mSecondaryImage = new Image(secondaryImagePath);
}