Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中类设计的最佳方式:一个例子_Java_Class_Class Design - Fatal编程技术网

Java中类设计的最佳方式:一个例子

Java中类设计的最佳方式:一个例子,java,class,class-design,Java,Class,Class Design,以下问题描述的最佳设计是: “学生”有4支钢笔,颜色分别为蓝色、红色、绿色和橙色 这是钢笔课- Class Pen{ String color; //Getters & setters public write(){ // Write some thing using color } } 第一条路: Class Studend{ //Here pens are stored in a HashMap with its Color as Key Map<

以下问题描述的最佳设计是:

“学生”有4支钢笔,颜色分别为蓝色红色绿色橙色

这是钢笔课-

Class Pen{
  String color;
  //Getters & setters
  public write(){
    // Write some thing using color
  }

}
第一条路:

Class Studend{
//Here pens are stored in a HashMap with its Color as Key
 Map<String,Pen> pens = new HashMap<String,Pen>();

 Public Student(Pen p){
   pens.put(p.getColor(),p);//Just an example
 }
 //more code here....

}
注意:我需要能够遍历所有笔并执行一些常见操作,例如

for(Pen pen: pens){ 
  pen.write();
}
第一种方式更容易

此外,笔需要单独访问,如
student.getRedPen()可以通过第二种方式轻松完成。但在第一种情况下,我需要尽可能地做到每一次

 if(student.getPens().containsKey("Red")){ 
  Pen redPen = student.getPens().get("Red");
   //some more code here
 }
哪个更好?有没有其他更好的方法来实现这一点


提前谢谢

您无法迭代多个属性(选项2),因此,如果有必要,您必须坚持使用选项1。此外,您的
get
特定彩色笔也可以这样进行优化:

/**
 * returns the Red pen if the student has one, null otherwise.
 */
public Pen getRed(){
    return pens.get("Red");
}
enum PenColor {
    RED,GREEN,BLUE,ORANGE
}

class Student {

    private Pen[] pens;

    public Student() {
        pens = new Pen[4];
        pens[PenColor.RED] = // instantiate red pen
        // etc
    }

    public Pen getPen(PenColor color) {
        return pens[color];
    }
}

您不能迭代多个属性(选项2),因此如果这是必需的,您必须坚持使用选项1。此外,您的
get
特定彩色笔也可以这样进行优化:

/**
 * returns the Red pen if the student has one, null otherwise.
 */
public Pen getRed(){
    return pens.get("Red");
}
enum PenColor {
    RED,GREEN,BLUE,ORANGE
}

class Student {

    private Pen[] pens;

    public Student() {
        pens = new Pen[4];
        pens[PenColor.RED] = // instantiate red pen
        // etc
    }

    public Pen getPen(PenColor color) {
        return pens[color];
    }
}

像这样的怎么样:

/**
 * returns the Red pen if the student has one, null otherwise.
 */
public Pen getRed(){
    return pens.get("Red");
}
enum PenColor {
    RED,GREEN,BLUE,ORANGE
}

class Student {

    private Pen[] pens;

    public Student() {
        pens = new Pen[4];
        pens[PenColor.RED] = // instantiate red pen
        // etc
    }

    public Pen getPen(PenColor color) {
        return pens[color];
    }
}

像这样的怎么样:

/**
 * returns the Red pen if the student has one, null otherwise.
 */
public Pen getRed(){
    return pens.get("Red");
}
enum PenColor {
    RED,GREEN,BLUE,ORANGE
}

class Student {

    private Pen[] pens;

    public Student() {
        pens = new Pen[4];
        pens[PenColor.RED] = // instantiate red pen
        // etc
    }

    public Pen getPen(PenColor color) {
        return pens[color];
    }
}

这是一个原型。您可以添加需要的任何其他方法:

public class Student {

private List<Pen> pens = new ArrayList<Pen>();

// Constructor + methods
}

public class Pen {

public enum Color {
    RED, BLUE, GREEN, ORANGE;
}

private Color color;

public Pen(Color color) {
    this.color = color;
}

// Getters & setters
public void write() {
    // Write some thing using color
}

}
公共班级学生{
私有列表笔=新的ArrayList();
//构造函数+方法
}
公共类钢笔{
公共枚举颜色{
红色、蓝色、绿色、橙色;
}
私人色彩;
公共钢笔(彩色){
这个颜色=颜色;
}
//接球手和接球手
公共空写(){
//用颜色写一些东西
}
}

这是一个原型。您可以添加需要的任何其他方法:

public class Student {

private List<Pen> pens = new ArrayList<Pen>();

// Constructor + methods
}

public class Pen {

public enum Color {
    RED, BLUE, GREEN, ORANGE;
}

private Color color;

public Pen(Color color) {
    this.color = color;
}

// Getters & setters
public void write() {
    // Write some thing using color
}

}
公共班级学生{
私有列表笔=新的ArrayList();
//构造函数+方法
}
公共类钢笔{
公共枚举颜色{
红色、蓝色、绿色、橙色;
}
私人色彩;
公共钢笔(彩色){
这个颜色=颜色;
}
//接球手和接球手
公共空写(){
//用颜色写一些东西
}
}
公共类笔{
私有字符串颜色;
公共钢笔(){}
公共钢笔(字符串颜色){
这个。颜色=颜色;
}
公共空写(){
//用颜色书写
}
公共字符串getColor(){
返回此.color;
}
公共void setColor(字符串颜色){
这个。颜色=颜色;
}
}
公立班学生{
公共静态void main(字符串[]args){
列表笔=新的ArrayList();
笔。添加(新笔(“红色”);
笔。添加(新笔(“绿色”));
笔。添加(新笔(“蓝色”));
钢笔。添加(新钢笔(“橙色”);
}
}
公共类笔{
私有字符串颜色;
公共钢笔(){}
公共钢笔(字符串颜色){
这个。颜色=颜色;
}
公共空写(){
//用颜色书写
}
公共字符串getColor(){
返回此.color;
}
公共void setColor(字符串颜色){
这个。颜色=颜色;
}
}
公立班学生{
公共静态void main(字符串[]args){
列表笔=新的ArrayList();
笔。添加(新笔(“红色”);
笔。添加(新笔(“绿色”));
笔。添加(新笔(“蓝色”));
钢笔。添加(新钢笔(“橙色”);
}
}

->一般来说,这实际上取决于你打算进一步使用这些笔做什么,学生是否能在某个时候获得第五支粉色笔等。这两种方法都有一些优点,但如果你需要迭代所有笔,第二种方法实际上是不可行的(除非你想使用一个反射-可怕的想法)。一般来说,这些类型的问题应该转到codereview,而不是StackOverflow。如果笔数始终为4,那么我可能会受到一组变量的诱惑。然而,如果不同学生的数字不同,那么收集总是更好的选择。@Norbert在这里有一个简单的答案。它总是关于未来的证明。如果学生获得了两支相同颜色的钢笔,或者一支不同颜色的新钢笔,会发生什么情况?我本能地认为你可以消除第二种方法。@Nobert最不可能的是以后再加一支笔。我尝试了这两种方法,但我不得不大量编写冗余代码。->一般来说,这取决于你打算用这些笔做什么,学生是否能在某个时候获得第五支粉红色笔等等。这两种方法都有一些优点,但如果你需要迭代所有笔,第二种方法确实是不可行的(除非你想使用反射-可怕的想法)。一般来说,这些类型的问题应该交给codereview,而不是StackOverflow。如果笔数始终为4,那么我可能会被一组变量的选项所吸引。但是,如果不同学生的笔数不同,那么集合总是更好的选项。@Norbert在这里有一个简单的答案。这是al关于未来打样的方法。如果学生获得了两支相同颜色的钢笔,或者一支不同颜色的新钢笔,会发生什么?本能地我认为你可以取消第二种方法。@Nobert最不可能的是以后再添加一支钢笔。我尝试了这两种方法,但我不得不大量编写冗余代码。当学生们将在某个时候得到另一支红色的
笔(如果每支笔只有一支的话,这一切都很好)。如果添加了相同颜色的新笔,blazy的答案是更好使用enum是好的,但如果我必须添加和删除一支特定的笔,它又会变得很困难。当学生在某个时候会得到另一支红色
笔时会发生什么情况?;)如果每支笔只有一支,这一切都是好的。如果添加了相同颜色的新笔,blazy的答案是更好使用enum是好的,但如果我必须添加和删除特定的笔,它又会变得很困难。