Based on the common requirement of using a checkbox when doing test automation, we can define a Checkbox class to encapsulate the behaviours as following, and it only has two public methods, setValue and isChecked.
public class Checkbox<Where extends Searchable<Where>> {
    private final Where where;
    private final Locator<Where, Element> locator;
    /**
     * Constructor of the checkbox.
     *
     * @param where    the place the checkbox can be found
     * @param selector the selector that leads to the checkbox
     */
    Checkbox(final Where where, Supplier<By> selector) {
        this.where = where;
        this.locator = element(selector);
    }
    /**
     * Change the checkbox according to the value parameter
     *
     * @param value true or false
     */
    public void setValue(boolean value) {
        Element apply = locator.locate(where);
        if (apply != null && apply.isSelected() != value) {
            apply.click();
        }
    }
    /**
     * @return whether the checkbox is checked or not
     */
    public boolean isChecked() {
        return locator.and(CHECKED).and(TRUE).test(where);
    }
}
If you don't want to create a new instance of Checkbox, you can use the helper methods in FormControl to read and write the checkbox that can be found using the locator parameter,
    /**
     * Check if the checkbox is checked by the given selector.
     *
     * @param selector selector
     * @return true if it is checked.
     */
    @SuppressWarnings("unchecked")
    default public boolean isChecked(Supplier<By> selector) {
        return new Checkbox<>((Where) this, selector).isChecked();
    }
    /**
     * Set checkbox to the given value.
     *
     * @param selector selector
     * @param value    value
     */
    @SuppressWarnings("unchecked")
    default public void check(Supplier<By> selector, boolean value) {
        new Checkbox<>((Where) this, selector).setValue(value);
    }
So in a page,
        AbstractPage page = new AbtractPage(Browsers.CHROME);
        System.out.println(page.isChecked(CONFIRM_EMAIL_)),
        System.out.println(page.isChecked(RATINGS_______)),
        page.check(CONFIRM_EMAIL_, false);
        page.check(RATINGS_______, true);
And it will print true and false on the console and change the checkboxes to the following,
Here is the code how it is used in a form and a page object and a test,
public class OtherInformationForm extends AbstractPage {
    public OtherInformationForm(AbstractPage page) {
        super(page);
    }
    public void setOtherInformation(OtherInformation info) {
        put(BILLING_EMAIL___, info.emailAddress);
        put(COMMENTS________, info.comments);
        check(CONFIRM_EMAIL_, info.confirmEmail);
        check(RATINGS_______, info.askRating);
        radio(MAILING_OPTION, info.mailingOptions);
    }
    public OtherInformation getOtherInformation() {
        return new OtherInformation(
                get(BILLING_EMAIL___),
                isChecked(CONFIRM_EMAIL_),
                isChecked(RATINGS_______),
                MailingOptions.valueOf(get(MAILING_OPTION)),
                get(COMMENTS________));
    }
}
public class ShoppingCartPage extends AbstractPage {
    private final BillingAddressForm billingAddressForm = new BillingAddressForm(this);
    private final CreditCardForm creditCardForm = new CreditCardForm(this);
    private final OtherInformationForm otherInformationForm = new OtherInformationForm(this);
    public ShoppingCartPage(AbstractPage page) {
        super(page);
    }
    public void setBillingAddress(Address address) {
        billingAddressForm.setBillingAddress(address);
    }
    public void getBillingAddress() {
        billingAddressForm.getBillingAddress();
    }
    public void setCreditCard(CreditCard card) {
        creditCardForm.setCreditCard(card);
    }
    public CreditCard getCreditCard() {
        return creditCardForm.getCreditCard();
    }
    public void setQuantity(int quantity) {
        put(Xpath.QUANTITY, quantity);
        button(UPDATE).click();
    }
    public void setOtherInformation(OtherInformation info) {
        otherInformationForm.setOtherInformation(info);
    }
    public OtherInformation getOtherInformation() {
        return otherInformationForm.getOtherInformation();
    }
    public void continues() {
        button(CONTINUE).click();
    }
    public ErrorMessages getErrorMessages() {
         return new ErrorMessages(this);
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:bookstore/beans/context.xml"})
public class BookStoreShoppingTest {
    @Autowired
    private Address billingAddress;
    @Autowired
    private CreditCard creditCard;
    @Autowired
    private OtherInformation otherInformation;
    @Autowired
    private ErrorMessages expectedErrorMessages;
    @Autowired
    private BookStoreHomePage homePage;
    @Test
    public void invalidCardInfo() {
        BookListPage listPage = new BookListPage(homePage, homePage.link(JAVA), IS_COPYRIGHTED) {{
            open();
            link(ACTIVE_MQ_IN_ACTION).click();
        }};
        BookDetailsPage bookPage = new BookDetailsPage(listPage) {{
            until(IS_COPYRIGHTED);
            secondAddToCart().click();
        }};
        ShoppingCartPage cartPage = new ShoppingCartPage(bookPage) {{
            setQuantity(2);
            setBillingAddress(billingAddress);
            setCreditCard(creditCard);
            setOtherInformation(otherInformation);
            continues();
        }};
        assertEquals(expectedErrorMessages, cartPage.getErrorMessages());
    }
    @Test
    public void invalidCardInfoNormalWay() {
        BookListPage listPage = new BookListPage(homePage, homePage.link(JAVA), IS_COPYRIGHTED);
        listPage.open();
        listPage.link(ACTIVE_MQ_IN_ACTION).click();
        BookDetailsPage bookPage = new BookDetailsPage(listPage);
        bookPage.until(IS_COPYRIGHTED);
        bookPage.secondAddToCart().click();
        ShoppingCartPage cartPage = new ShoppingCartPage(bookPage);
        cartPage.setQuantity(2);
        cartPage.setBillingAddress(billingAddress);
        cartPage.setCreditCard(creditCard);
        cartPage.setOtherInformation(otherInformation);
        cartPage.continues();
        assertEquals(expectedErrorMessages, cartPage.getErrorMessages());
    }
    @Before
    public void setup() {
        homePage.open();
    }
    @After
    public void close() {
        homePage.close();
    }
}





















