I am developing applications for android. In my application, the user can add information about his weight and watch the progress of weight change. I decided to add filtering of the elements according to the following criteria: the presence of a comment, the absence of a comment, weight gain, weight reduction. For this, I wrote the WeightFilterUseCase and WeightFilterUseCaseTest classes for testing. Could you talk about the flaws of my code?
WeightFilterUseCase
public class WeightFilterUseCase {
public List<WeightUI> filter(List<WeightUI> weights, WeightFilter weightFilter) {
switch (weightFilter) {
case ShowOnlyHaveComment:
return filterByEmptyComment(weights, true);
case ShowOnlyHaventComment:
return filterByEmptyComment(weights, false);
case ShowOnlyWeightGrowing:
return filterWeightByChange(weights, WeightChange.WeightGrowing);
case ShowOnlyWeightDecreases:
return filterWeightByChange(weights, WeightChange.WeightDecreases);
}
throw new EnumConstantNotPresentException(WeightFilter.class, weightFilter.toString());
}
private List<WeightUI> filterByEmptyComment(List<WeightUI> weights, boolean isEmpty) {
return weights.stream().filter(weight -> weight.getComment().trim().isEmpty() == isEmpty).collect(Collectors.toList());
}
private List<WeightUI> filterWeightByChange(List<WeightUI> weights, WeightChange weightChange) {
return weights.stream().filter(weight -> weight.isWeightGrowing() == weightChange).collect(Collectors.toList());
}
public enum WeightFilter {
ShowOnlyHaveComment,
ShowOnlyHaventComment,
ShowOnlyWeightGrowing,
ShowOnlyWeightDecreases
}
}
WeightFilterUseCaseTest
public class WeightFilterUseCaseTest {
private List<WeightUI> weights = new ArrayList<>();
private WeightFilterUseCase weightFilterUseCase = new WeightFilterUseCase();
@Before
public void init() {
weights.add(new WeightUI(new Weight(0, 0, 0, "ds", ""), WeightChange.WeightNotChange, 0));
weights.add(new WeightUI(new Weight(0, 0, 0, "", ""), WeightChange.WeightNotChange, 0));
weights.add(new WeightUI(new Weight(0, 0, 0, "ds", ""), WeightChange.WeightGrowing, 0));
weights.add(new WeightUI(new Weight(0, 0, 0, "", ""), WeightChange.WeightDecreases, 0));
}
@Test
public void testFilterOnlyHaveComment() {
List<WeightUI> filterWeights = weightFilterUseCase.filter(weights, WeightFilterUseCase.WeightFilter.ShowOnlyHaveComment);
assert filterWeights.get(0).equals(weights.get(0));
assert filterWeights.get(1).equals(weights.get(2));
assert filterWeights.size() == 2;
}
@Test
public void testFilterOnlyHaventComment() {
List<WeightUI> filterWeights = weightFilterUseCase.filter(weights, WeightFilterUseCase.WeightFilter.ShowOnlyHaventComment);
assert filterWeights.get(0).equals(weights.get(1));
assert filterWeights.get(1).equals(weights.get(3));
assert filterWeights.size() == 2;
}
@Test
public void testFilterOnlyWeightGain() {
List<WeightUI> filterWeights = weightFilterUseCase.filter(weights, WeightFilterUseCase.WeightFilter.ShowOnlyWeightGrowing);
assert filterWeights.get(0).equals(weights.get(2));
assert filterWeights.size() == 1;
}
@Test
public void testFilterOnlyWeightDecreases() {
List<WeightUI> filterWeights = weightFilterUseCase.filter(weights, WeightFilterUseCase.WeightFilter.ShowOnlyWeightDecreases);
assert filterWeights.get(0).equals(weights.get(3));
assert filterWeights.size() == 1;
}
}
WeightChange
public enum WeightChange {
WeightGrowing(-1),
WeightDecreases(1),
WeightNotChange(0);
int change;
WeightChange(int change) {
this.change = change;
}
public static WeightChange getByChange(int chane) {
for (WeightChange weightChange : values()) {
if (weightChange.change == chane) return weightChange;
}
return WeightNotChange;
}
}
WeightUI
class WeightUI (baseWeight: Weight): Weight(baseWeight){
var isWeightGrowing:WeightChange = WeightChange.WeightNotChange
var changeWeight: Double = 0.0
var isSelect = false
constructor(weight: Weight,isWeightGrowing : WeightChange,changeWeight:Double) : this(weight){
this.isWeightGrowing = isWeightGrowing
this.changeWeight = changeWeight
this.isSelect = isSelect
}
}
Weight
@Entity
open class Weight(@PrimaryKey(autoGenerate = true) var id: Long = 0, override var weight: Float = 0.0f,
override var date: Long = 0, var comment: String = "",var userName : String = "") : WeightGraphPoint, Parcelable {
constructor(weight: Weight) : this(weight.id, weight.weight, weight.date, weight.comment,weight.userName)
constructor(weight: Float,date:Long,userName: String) : this(0,weight,date,userName)
constructor(parcel: Parcel) : this(
parcel.readLong(),
parcel.readFloat(),
parcel.readLong(),
parcel.readString() ?: "",
parcel.readString()?: "")
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeLong(id)
parcel.writeFloat(weight)
parcel.writeLong(date)
parcel.writeString(comment)
parcel.writeString(userName)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Weight> {
override fun createFromParcel(parcel: Parcel): Weight {
return Weight(parcel)
}
override fun newArray(size: Int): Array<Weight?> {
return arrayOfNulls(size)
}
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null) return false
val other = other as Weight
if (weight == other.weight && date == other.date)
return true
return false
}
}