gpt4 book ai didi

java - 构造函数与类的 main 方法中的断言语句背后的推理是什么?

转载 作者:行者123 更新时间:2023-12-02 05:41:00 26 4
gpt4 key购买 nike

I'm taking this online Java course并且不理解代码中不同断言部分背后的推理。

为什么类的 main 方法中的rankToString 断言方法与类的构造函数中的 isValidRank 方法不同?

public class Card {
private final int rank;
private final int suit;

// Kinds of suits
public final static int DIAMONDS = 1;
public final static int CLUBS = 2;
public final static int HEARTS = 3;
public final static int SPADES = 4;

// Kinds of ranks
public final static int ACE = 1;
public final static int DEUCE = 2;
public final static int THREE = 3;
public final static int FOUR = 4;
public final static int FIVE = 5;
public final static int SIX = 6;
public final static int SEVEN = 7;
public final static int EIGHT = 8;
public final static int NINE = 9;
public final static int TEN = 10;
public final static int JACK = 11;
public final static int QUEEN = 12;
public final static int KING = 13;

public Card(int rank, int suit) {
assert isValidRank(rank);
assert isValidSuit(suit);
this.rank = rank;
this.suit = suit;
}

public int getSuit() {
return suit;
}

public int getRank() {
return rank;
}

public static boolean isValidRank(int rank) {
return ACE <= rank && rank <= KING;
}

public static boolean isValidSuit(int suit) {
return DIAMONDS <= suit && suit <= SPADES;
}

public static String rankToString(int rank) {
switch (rank) {
case ACE:
return "Ace";
case DEUCE:
return "Deuce";
case THREE:
return "Three";
case FOUR:
return "Four";
case FIVE:
return "Five";
case SIX:
return "Six";
case SEVEN:
return "Seven";
case EIGHT:
return "Eight";
case NINE:
return "Nine";
case TEN:
return "Ten";
case JACK:
return "Jack";
case QUEEN:
return "Queen";
case KING:
return "King";
default:
//Handle an illegal argument. There are generally two
//ways to handle invalid arguments, throwing an exception
//(see the section on Handling Exceptions) or return null
return null;
}
}

public static String suitToString(int suit) {
switch (suit) {
case DIAMONDS:
return "Diamonds";
case CLUBS:
return "Clubs";
case HEARTS:
return "Hearts";
case SPADES:
return "Spades";
default:
return null;
}
}

public static void main(String[] args) {

// must run program with -ea flag (java -ea ..) to
// use assert statements
assert rankToString(ACE) == "Ace";
assert rankToString(DEUCE) == "Deuce";
assert rankToString(THREE) == "Three";
assert rankToString(FOUR) == "Four";
assert rankToString(FIVE) == "Five";
assert rankToString(SIX) == "Six";
assert rankToString(SEVEN) == "Seven";
assert rankToString(EIGHT) == "Eight";
assert rankToString(NINE) == "Nine";
assert rankToString(TEN) == "Ten";
assert rankToString(JACK) == "Jack";
assert rankToString(QUEEN) == "Queen";
assert rankToString(KING) == "King";

assert suitToString(DIAMONDS) == "Diamonds";
assert suitToString(CLUBS) == "Clubs";
assert suitToString(HEARTS) == "Hearts";
assert suitToString(SPADES) == "Spades";

}
}

最佳答案

main方法中的assert测试关于静态final字段的断言,构造函数中的assert测试关于非静态的断言最后的字段。由于不应在每次创建对象时都测试有关静态字段的断言,并且非静态字段需要实例,因此将断言放在那里是有意义的。

但是我建议编写 jUnit 测试而不是使用 assert

<小时/>

您会发现 tutorial for jUnit at vogella.com .

jUnit 的一些好处:

  • 您不必将测试与代码混合在一起,这使得代码更具可读性。
  • 您可以测试函数调用序列等。不改变代码的行为(例如,如果不向代码添加 try-catch block ,很难测试断言中是否抛出异常)
  • 大多数 IDE 都为 jUnit 提供了良好的用户界面
  • 当您检查您的断言时,您可以更好地控制。例如。您可以创建 2 个Card,而无需检查构造函数中的断言两次。

关于java - 构造函数与类的 main 方法中的断言语句背后的推理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24520763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com