在Java中创建和使用组合类,以使用用户输入创建和存储对象

时间:2016-05-18 20:08:14

标签: java class object getter-setter netbeans-8

我正在尝试构建一个显示属性列表的应用程序,并允许用户添加属性,删除属性或更新属性。

粗体字是我认为应该是Classes的东西。

属性地址 ViewingArrangement
地址包含streetNumber,streetName,suburb和postalCode ViewingArrangement 有一个 ContactPerson 和一个openTime。
ContactPerson 有一个名称,officeLocation和phoneNumber
我的问题是,我不知道如何创建一个由另一个类的对象组成的类 例如。 ViewingArrangement 有一个openTime, ContactPerson 是一个类。

如何创建 ViewingArrangement 类?我如何做getter-setters,构造函数等?我一直在尝试和改变我的程序,我仍然不能完全正确。我是新来的,请帮忙!

package PropertyListing.data;

public class ContactPerson {
String cpName;
String office;
String pNo;

public ContactPerson(String name, String off, String pno)
{
    String cpName = name;
    String office = off;
    String pNo = pno;
}

public void setCpName(String cpName) 
{
    this.cpName = cpName;
}

public String getCpName() 
{
    return cpName;
}

public String getOffice() 
{
    return office;
}

public void setOffice(String office) 
{
    this.office = office;
}

public String getPno() 
{
    return pNo;
}

public void setPno(String pno) 
{
    this.pNo = pno;
}
}

以下是我的ViewingArrangement类..请帮助:(

package PropertyListing.data;

public class ViewingArrangement {
String availTime;
private ContactPerson cp;

public ViewingArrangement (String availT, ContactPerson p)
{
  this.availTime = availT;
}

public String getVAtime ()
{
    return availTime;
}

public void setVAtime(String availTime)
{
    this.availTime = availTime;
}

public ContactPerson getCP()
{
    return cp;
}

public void setCP(ContactPerson cp)
{
    this.cp = cp;
}


以上就是我经过一整天的乱七八糟,谷歌搜索和改变之后的结果,请放轻松对待我。

我希望一旦我解决了这个问题,我就可以正确地存储我的属性,我的JList(我将setModel设置为DefaultListModel)会很好地显示Property,而不是显示“PropertyListing.data.Property@55f716”等内容。

我真的希望这是上面提到的问题,导致这种不良的存储/显示......

2 个答案:

答案 0 :(得分:0)

除了没有制作对象的字段private之外,你实际上做得非常正确。那么为什么它不能“正确显示”呢?

您可能正在使用Strings或某些GUI的System.out方法显示自定义对象,例如setText。这样可以正常工作,但是你没有告诉你的JVM如何打印你的对象!

默认情况下,执行上述某种情况时,会调用对象的toString方法。此方法继承自Object,默认情况下会打印有关该对象的一些内存数据。 String通过返回它存储的字符来覆盖它。

您的自定义对象需要覆盖toString才能正常显示。以下是ViewingArrangement的示例,您可以根据自己的喜好进行调整:

@Override
public String toString() {
    return "Viewing Arrangement: availTime - "+availtime+", Contact Person - "+cp;
}

当您的ContactPerson类有自己的覆盖toString方法时,上述方法会自动调用toString,因为cp被添加到String

不过,

toString不应该过分依赖。您可以考虑使用一个实用程序类来单独格式化“最高”类的每个值(在您的情况下,它将是Property),返回可读的String

答案 1 :(得分:0)

你需要做的是创建一个包含其他Property类的Property类,它听起来就像你可以使用的那样称为Map

您可以改为创建一个包含“自身”的对象,而不是尝试创建包含各种不同实例数据的对象,这样您就可以在属性字段中放置任何内容,并且仍然可以轻松访问您的数据。 Tree对此实现很有帮助,因为您可以保存由更多属性和单个属性字段组成的属性。

import java.util.*;

public class Property {

    private Map<String, Property> properties;
    private String data;

    public Property() {

            properties = new ArrayList<HashMap>();
            data = null;

    }

    public void setData(String propertyName, String newData) {

        // if we can find another field to put this in, do so. Else, store it in this property.
        if (!properties.containsKey(propertyName)
            properties.get(propertyName).setData(newData);
        else
            data = newData;
    }

    public String getData(String key) {

        properties.get(key).getData();

    }

}

使用它,您可以有效地(并递归地!)创建一个属性树,您可以使用它来存储和引用它。可以修改这样的类以适应您需要存储的任何其他类。希望这有帮助!