Java中类设计的最佳方式:一个例子
以下问题描述的最佳设计是: “学生”有4支钢笔,颜色分别为蓝色、红色、绿色和橙色 这是钢笔课-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<
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是好的,但如果我必须添加和删除特定的笔,它又会变得很困难。