首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >名为HeadPhone的Java类表示耳机集

名为HeadPhone的Java类表示耳机集
EN

Code Review用户
提问于 2018-09-14 21:12:03
回答 3查看 703关注 0票数 2

创建一个名为HeadPhone的Java类来表示耳机集。该课程包括:

  • 名为低、中和高的三个常数,其值分别为1、2和3,以表示耳机音量。
  • 一个名为音量的私有int数据字段,指定耳机的音量。默认的卷是中等的。
  • 名为pluggedIn的专用布尔数据字段,指定耳机是否已插入。默认值为false。
  • 指定耳机制造商名称的私有字符串数据字段。
  • 一个名为headPhoneColor的私有颜色数据字段,指定耳机的颜色。
  • 一个名为headPhoneModel的私有字符串数据字段,指定耳机的模型。
  • 所有数据字段的getter和setter方法。
  • 创建默认耳机的无参数构造函数。
  • 一个名为toString()的方法,它返回描述耳机当前字段值的字符串。
  • 一个名为changeVolume( value )的方法,它将耳机的音量更改为传递给该方法的值

创建至少构造3个TestHeadPhone对象的HeadPhone类。对于每个构造的对象,演示每个方法的使用。

这是我目前所拥有的..。

代码语言:javascript
复制
import java.awt.Color;

public class HeadPhones {
    public static final int LOW = 1;
    public static final int MEDIUM = 2;
    public static final int HIGH = 3;

    private int volume;
    private boolean pluggedIn;
    private String manufacturer;
    private Color headPhoneColor;

    public HeadPhones() {
        volume = MEDIUM;
        pluggedIn = false;
        manufacturer = "";
        headPhoneColor = Color.BLACK;
    }
    /**
     *
     * @return volume of headphone
     */
    public int getVolume() {
        return volume;
    }
    /**
     * set volume of headphone
     *
     * @param volume
     */
    public void setVolume(int volume) {
        this.volume = volume;
    }
    /**
     *
     * @return true if the headphone is plugged in, false otherwise
     */
    public boolean getPluggedIn() {
        return pluggedIn;
    }
    /**
     * set plugged in
     *
     * @param pluggedIn
     */
    public void setPluggedIn(boolean pluggedIn) {
        this.pluggedIn = pluggedIn;
    }
    /**
     *
     * @return manufacturer
     */
    public String getManufacturer() {
        return manufacturer;
    }
    /**
     * set manufacturer
     *
     * @param manufacturer
     */
    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }
    /**
     *
     * @return headphone color
     */
    public Color getHeadPhoneColor() {
        return headPhoneColor;
    }
    public String getColorName() {
        String colorName = "Black";
        if (headPhoneColor == Color.BLACK || headPhoneColor == Color.black) {
            colorName = "Black";
        } else if (headPhoneColor == Color.WHITE || headPhoneColor == Color.white) {
            colorName = "White";
        } else if (headPhoneColor == Color.RED || headPhoneColor == Color.red) {
            colorName = "Red";
        } else if (headPhoneColor == Color.PINK || headPhoneColor == Color.pink) {
            colorName = "Pink";
        } else if (headPhoneColor == Color.CYAN || headPhoneColor == Color.cyan) {
            colorName = "Cyan";
        } else if (headPhoneColor == Color.BLUE || headPhoneColor == Color.blue) {
            colorName = "Blue";
        } else if (headPhoneColor == Color.GREEN || headPhoneColor == Color.green) {
            colorName = "Green";
        } else if (headPhoneColor == Color.GRAY || headPhoneColor == Color.gray) {
            colorName = "Gray";
        }
        return colorName;
    }
    /**
     * set headphone color
     *
     * @param headPhoneColor
     */
    public void setHeadPhoneColor(Color headPhoneColor) {
        this.headPhoneColor = headPhoneColor;
    }
    /**
     * returns a string describing the current field values of the headphone
     */
    public String toString() {
        StringBuilder s = new StringBuilder("(");
        s.append("manufacturer = ").append(manufacturer).append(", ");
        s.append("volumne = ").append(volume).append(", ");
        s.append("plugged in = ").append(pluggedIn).append(", ");
        s.append("color = ").append(getColorName()).append(")");
        return s.toString();
    }
}

这是我的考试课..。

代码语言:javascript
复制
import java.awt.Color;

public class TestHeadPhones {
    public static void main(String[] args) {
        HeadPhones[] headphones = new HeadPhones[3];

        headphones[0] = new HeadPhones();
        headphones[0].setHeadPhoneColor(Color.CYAN);
        headphones[0].setManufacturer("Thinksound");
        headphones[1] = new HeadPhones();
        headphones[1].setManufacturer("Monster");
        headphones[1].setHeadPhoneColor(Color.white);
        headphones[1].setPluggedIn(true);
        headphones[1].setVolume(HeadPhones.HIGH);
        headphones[2] = new HeadPhones();
        headphones[2].setManufacturer("Sennheiser");
        headphones[2].setHeadPhoneColor(Color.ORANGE);
        headphones[2].setPluggedIn(true);
        headphones[2].setVolume(HeadPhones.LOW);
        for (int i = 0; i < 3; i++) {
            System.out.println("Headphone #" + (i + 1));
            System.out.println("toString() results: " + headphones[i]);
            System.out.println("getVolume() results: " + headphones[i].getVolume());
            System.out.println("getPluggedIn() results: " + headphones[i].getPluggedIn());
            System.out.println("getManufacturer() results: " + headphones[i].getManufacturer());
            System.out.println("getHeadPhoneColor() results: " + headphones[i].getColorName() + "\n");
        }
    }
}
EN

回答 3

Code Review用户

发布于 2018-09-14 21:48:39

因为这个类的大多数都是getter和setter,所以没有什么可评论的内容。

我看到的最大问题是getColorName方法。它正在进行不必要的检查,而且我通常会在这种情况下使用Map。对此,地图查找速度更快,而且在我看来更整洁一些。在这种情况下,看起来应该是:

代码语言:javascript
复制
Map<Color, String> colorToName = new HashMap<>();

colorToName.put(Color.BLACK, "Black");
colorToName.put(Color.WHITE, "White");
colorToName.put(Color.PINK, "Pink");
colorToName.put(Color.CYAN, "Cyan");
colorToName.put(Color.BLUE, "Blue");
colorToName.put(Color.GREEN, "Green");
colorToName.put(Color.GRAY, "Gray");

然后,为了得到这个名字,你可以:

代码语言:javascript
复制
colorToName.get(Color.PINK); // Returns "Pink"

您可能希望将colorToName初始化为类的静态成员,这样就不会不断地重新创建它。

注意我是如何忽略小写变体的。那是因为,如果你看看来源:

代码语言:javascript
复制
/**
 * The color pink.  In the default sRGB space.
 */
public final static Color pink      = new Color(255, 175, 175);

/**
 * The color pink.  In the default sRGB space.
 * @since 1.4
 */
public final static Color PINK = pink;

它们指的是同一件事,所以检查两者都是多余的。

票数 1
EN

Code Review用户

发布于 2018-09-14 22:10:17

这是一个非常简单的练习,你做得很好。

对需求的批评(不是您的代码):

  • 字段headPhoneColorheadPhoneModel是冗长和冗余的。为什么不只是colormodel呢?
  • 为什么是changeVolume(value)而不是setVolume(value)?我认为你的setVolume(value)更好。
  • 我认为,一旦对象被实例化,某些特性是不可变的:制造商、颜色和模型。也许这些字段不应该有设置者。

对您的代码的批评:

  • getPluggedIn()是一个返回boolean的谓词。按照惯例,它应该被称为isPluggedIn()
  • 这些耳机能升到11头吗?在setVolume(volume)中执行一些验证并在需要时抛出一个IllegalArgumentException可能是个好主意。
  • getColorName()函数可能需要一些工作。String colorName = "Black"分配是多余的,因此应该避免。有趣的是,Color.toString()文档说您不应该依赖它,但我还是会使用它作为后盾,因为可以在预定义的调色板之外创建颜色。switch块可以工作:公共字符串getColorName() { switch (this.headPhoneColor) { case Color.BLACK: case Color.black:返回"Black";case Color.WHITE: case Color.white:返回"White";…默认值:返回this.headPhoneColor.toString();}
  • toString()中,"volumne“是一个拼写错误。
  • 从技术上讲,您不必显式地编写构造函数,因为它隐式地提供了一个零参数公共构造函数。公共类HeadPhones {公共静态最终int = 1;公共静态最终int介质= 2;公共静态最终int高= 3;私有int卷=媒体;私有布尔值pluggedIn;私有字符串制造商= "";私有颜色headPhoneColor = Color.BLACK;公共int getVolume() {返回卷;}…
票数 1
EN

Code Review用户

发布于 2018-10-15 03:31:52

您的代码看起来不错,但是需求看起来相当过时。

自2004年9月以来,像示例中的卷这样的符号常量不再定义为int,而是定义为enum

代码语言:javascript
复制
public enum Volume {
    OFF, LOW, MEDIUM, HIGH
}

使用枚举比int更安全,因为类的用户不能意外地将卷设置为-17或12345。唯一无效的值是null,您可以很容易地防御它:

代码语言:javascript
复制
public void setVolume(Volume volume) {
    this.volume = Objects.requireNotNull(volume);
}

在您的代码中,您已经为一些方法编写了Javadoc注释/** … */。对于代码的任何读者来说,注释都是很重要的。注释应该包含通过查看方法的定义而无法轻易看到的所有细节。

当前,您的注释仅重复方法定义中的单词。这个信息是无用的,应该删除。相反,在setVolume(int)的注释中,您应该提到只有低、中和高的值是允许的,以及当有人用无效的值调用该方法时会发生什么。

在您了解ifthrow语句之前,评论应该只说“不要那样做”。在一些星期内,您应该为无效的值抛出一个异常,并相应地更新注释。

您的toString方法现在看起来相当复杂。很多人都使用这种风格,但有一种很好的方式:

代码语言:javascript
复制
public String toString() {
    return String.format(
        "Headphone %s by %s, %s, volume %s",
        model,
        manufacturer,
        pluggedIn ? "plugged in" : "unplugged",
        volume);
}

这种样式使您很容易看到生成的字符串的一般模式。每个%s都是一个占位符,按照给定的顺序用下面行中的值替换。

操作符用于生成人类可读的文本,而不是非常技术性的true/false。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/203753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档