BasicTextStatistics.java
package com.kapil.verbametrics.domain;
/**
* Domain record representing basic text statistics with validation.
*
* @author Kapil Garg
*/
public record BasicTextStatistics(
int wordCount,
int sentenceCount,
int characterCount,
int characterCountNoSpaces,
int paragraphCount
) {
public BasicTextStatistics {
BaseDomainResult.validateNonNegative(wordCount, "Word count");
BaseDomainResult.validateNonNegative(sentenceCount, "Sentence count");
BaseDomainResult.validateNonNegative(characterCount, "Character count");
BaseDomainResult.validateNonNegative(characterCountNoSpaces, "Character count without spaces");
BaseDomainResult.validateNonNegative(paragraphCount, "Paragraph count");
if (characterCountNoSpaces > characterCount) {
throw new IllegalArgumentException("Character count without spaces cannot exceed total character count");
}
}
/**
* Calculates the average number of words per sentence.
*
* @return average words per sentence, or 0.0 if no sentences
*/
double averageWordsPerSentence() {
return BaseDomainResult.safeDivide(wordCount, sentenceCount);
}
/**
* Calculates the average number of characters per word.
*
* @return average characters per word, or 0.0 if no words
*/
double averageCharactersPerWord() {
return BaseDomainResult.safeDivide(characterCountNoSpaces, wordCount);
}
@Override
public String toString() {
return """
BasicTextStatistics{
wordCount=%d, sentenceCount=%d, characterCount=%d,
characterCountNoSpaces=%d, paragraphCount=%d,
avgWordsPerSentence=%.2f, avgCharactersPerWord=%.2f
}""".formatted(
wordCount, sentenceCount, characterCount, characterCountNoSpaces,
paragraphCount, averageWordsPerSentence(), averageCharactersPerWord()
);
}
}