开发者

representing different kind of players in a class [closed]

Closed. This question is off-topic. It is not currently accepting answers.
开发者_C百科

Want to improve this question? Update the question so it's on-topic for Stack Overflow.

Closed 11 years ago.

Improve this question

I am writing a class to represent cricket players. There are four types of cricket players

1 wicket player

2 batsman

3 bowler

4 allrounder

I'm not sure if I am representing the players in the right way

public class Player {
  final static int WICKETPLAYER=1;
  final static int BATSMAN=2;
  final static int  BOWLER=3;
  final static int ALLROUNDER=4;
  int currentbatting;
  int bowlerbating;
  int playertype;

  public Player(int i,int currentbatting){
      this.currentbatting=currentbatting;
      playertype=i;

  }

  public String whatTypeOFplayer(){
      switch(playertype){
      case WICKETPLAYER:
          return "wicketplayer" ;
      case BATSMAN:
          return " batsman";
      case BOWLER:
          return "bowler";
      case ALLROUNDER:
          return "allrounder";
          default:
              return "error";
      }
  }


}


First of all, you should use enums to represent the player types instead of ints, like

enum PlayerType {
 WICKETPLAYER,
 BATSMAN,
 BOWLER,
 ALLROUNDER
}

Then you could use the name() method to get a string representation of the PlayerType.

If there's more to the player types that just the name (e.g. different behaviour, methods etc.), you might consider creating subclasses of Player, like class WicketPlayer extends Player.

A third way would be to use composition and add components like PlayerBehaviour etc. to the basic player class.

I terms of complexity, I'd say no. 1 is the easiest, whereas no. 3 might be too complex for you right now. So you might try and either use no. 1 or no. 2, depending on your requirements.


You are likely to be better off with an enum and an EnumSet.

public Role {
  WICKET_KEEPER, BATSMAN, BOWLER, FIELDER
}

public static final Set<Role> ALL_ROUNDER = EnumSet.allOf(Role.class);
private final EnumSet<Role> roles;
private Role position;

public Player(EnumSet<Role> roles) { this.role = roles; }

public void setPosition(Role role) { this.position = role; }

public String whatTypeOFplayer(){
  return roles.equals(ALL_ROUNDER) ? "allrounder" : roles.toString();
}

BTW Its a Wicket Keeper not a Wicket Player
http://www.cricketscotland.com/system/files/images/13_13.jpg


A better way is to inherit from the class Player, it will allow you a simpler treatment for each player and different behaviors for common actions. for example:

Player.java

public class Player {
  int currentbatting;
  int bowlerbating;
  int playertype;

  public Player(int i,int currentbatting){
      this.currentbatting=currentbatting;
      playertype=i;
  }

  public abstract String whatTypeOFplayer() {
    return playertype;
  }
}

WicketPlayer.java

public WicketPlayer extends Player {
  public WicketPlayer(int i,int currentbatting){
    super(int i,int currentbatting);
    playertype = "wicketplayer";
  }
}

Batsman.java

public Batsman extends Player {
  public Batsman(int i,int currentbatting){
    super(int i,int currentbatting);
    playertype = "batsman";
  }
}

And so on.


use Java Enums: http://download.oracle.com/javase/tutorial/java/javaOO/enum.html


In this case - and because I smell homework - you should use one base class Player and a subclass for each player type.

Example:

public abstract class Player {
 // some attributes and methods all players share

 public abstract String whatTypeOfPlayer();
}

public WicketPlayer extends Player {
 @Override
 public String whatTypeOfPlayer() {
   return "Wicket Player";
 }
}

Bonus - then I'd use a factory to create players:

public PlayerFactory {
 enum PlayerType {WICKETPLAYER, BATSMAN, BOWLER, ALLROUNDER}

 public static Player createPlayer(PlayerType type, String name) {
   switch(type) {
     case WICKETPLAYER : return new WicketPlayer(name);
     //...
   }
 }
}


If you are using Java 5+ use Enum Types Java Enum Types. According to Effective Java it's not a good practice to use a bunch of constants, instead use Enum.

public class Player {

public enum Role{
  WICKETPLAYER,
  BATSMAN,
  BOWLER,
  ALLROUNDER;
}
 final int currentbatting;
 final Role playerRole;

  public Player(final Role role, final int currentbatting){
      this.currentbatting=currentbatting;
      this.playerRole=role;

  }

  public String whatTypeOFplayer(){
      return this.playerRole.toString();
  }

}

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜