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

标签 java constructor program-entry-point assert

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/

相关文章:

c - 在 C 中硬编码或替换 char **argv

java - MQ 队列应允许最大 5MB 的文件传输

Java GUI 帮助(JFrame、JButton 等)

c++ - 这样写作业有什么问题?

没有 100% cpu 的 C 主循环

java - 线程 "main"java.lang.ArithmeticException :/by zero 中的异常

java - Android 中相对布局中的动画重新定位其他 View

java - 按钮不会相互水平显示。只是相互重叠

ios - Objective c 初始值设定项的歧义

c++ - 模板类的构造函数在使用 new 关键字时调用类型构造函数