2010-08-20 36 views
1
public class People { 
// Code to create a random set of people omitted 

public Set getAllPeople() { 
    return people; 
} 

public void setPerson(Person person) { 
    if (person.getId() == -1) { 
     person.setId(getNextId()); 
    } 

    people.remove(person); 
    people.add(person); 
} 

public void deletePerson(Person person) { 
    people.remove(person); 
} 

private Set people = new HashSet(); 
} 

public class Person 
{ 
private int id; 
private String name; 
private String address; 
private float salary; 

// Getters, setters, equals and toString omitted 
} 

虽然照顾DWR网站,我发现这个例子。它说,他们省略了Getters,setters,equals和toString。如何编写这个程序的。我希望运行这个程序并看看。任何建议请。帮助。这个程序的Getters,setters,equals和toString是什么。如何写它

+0

这不是javascript,但我看到你复制这个从:http://directwebremoting.org/dwr-demo/people/index.html – palswim 2010-08-20 18:25:58

+0

是的正确的我想运行这个程序。但我不知道如何运行它。你能帮我吗。 – Gladiator 2010-08-20 18:32:53

+0

如果没有静态无效主类,则无法将此类作为程序运行。 – 2010-08-20 18:36:31

回答

3

吸气剂和吸附剂用于从外部检索您的“私人”变量(=只在他们被定义的类内部可见的变量)。

例如:

private String name; 

会有这样一个getter:

public String getName() { 
    return name; 
} 

而且像这样的二传:

public void setName(String name) { 
    this.name = name; 
} 

(你可以使用 “保护”,如果你只希望这个变量在包中可见,而不是在整个项目中)。

toString()方法在这里,如果你想显示一些关于你的对象的信息,这从调试的角度来看可能是有用的。

equals方法将用于知道如何与Person类型的对象进行比较(仅限于ID)。 看看这个link有更多关于什么是平等的信息。

正如RonK所建议的那样,如果你确实实现了equals,它们一起并且必须使用相同的字段(合同的一部分),那么一定要实现hashCode。

的规则是,如果:

objectA.equals(objectB) returns true 

然后

objectA.hashCode() has to be equal to objectB.hashCode() 
+1

+1解释什么是getter和setter以及为什么需要它 – RonK 2010-08-20 18:33:57

+0

另外,虽然这个问题没有特别的意义,但我会添加一个关于实现'hashCode'的注释,如另一个答案 – RonK 2010-08-20 18:35:42

+0

@RonK:是的,你是对的。我只添加了一个链接,其中有关于equals和hashCode的解释,因为我不确定我应该在答案中留下多深。我会编辑它,以便它更清晰,谢谢:) – 2010-08-20 18:39:29

2
public class Person 
{ 
    //Id should be unique 
    private int id; 
    private String name; 
    private String address; 
    private float salary; 

    public Person(int id, String name, String address, float salary) 
    { 
     this.id = id; 
     this.name = name; //Maybe check for null 
     this.address = address; //Maybe check for null 
     this.salary = salary; //Maybe check for > 0 
    } 

    public int getId() 
    { 
     return id; 
    } 

    //No setID() - do you want that? you properly shouldn't 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public String getAddress() 
    { 
     return address; 
    } 

    public void setAddress(String address) 
    { 
     this.address = address; //Maybe check for null 
    } 

    public float getSalary() 
    { 
     return salary; 
    } 

    public setSalary(float salary) 
    { 
     this.salary = salary; 
    } 

    //A person is equal if they have the same ID 
    @Override 
    public boolean equals(Object obj) 
    { 
     if (this == obj) return true; 
     if (obj == null) return false; 
     if (getClass() != obj.getClass()) return false; 

     Person person = (Person)obj; 

     return person.id == id; 
    } 

    @Override 
    public int hashCode() 
    { 
     return id; 
    } 

    //Just returns the name but you could return more details 
    @Override 
    public String toString() 
    { 
     return name; 
    } 
} 

新增hashCode这是至关重要的 - 特别是如果你在一个HashSet使用它。

+0

我无法理解上面的概念。请告诉我如何运行这段代码并看看,以便我更容易理解它。 – Gladiator 2010-08-20 18:49:15

+0

您可以删除'@ Overide'。请参阅http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why – 2010-08-20 19:10:41

2

在Person类需要定义2种方法

例如ID每个属性:

public void setId(int id) { 
    this.id = id; 
} 

public int getId() { 
    return id; 
} 

,你需要重写equals和hashCode方法把自己的条件平等

public boolean equals(Object that) { 
    if (that == null) { 
     return false; 
    } 
    if (!(that instanceof Person)) { 
     return false; 
    } 
    return this.id == ((Person) that).id; 
} 

public int hashCode() { 
    return id * 17; 
}