Nie zwracanie obiektu danej klasy w metodzie

0

Witam czy da radę jakoś zgrabnie zrobić coś takiego, że mam 2 metody

public Maker returnMaker(EntityManager entityManager, String makerName) {
		boolean check = checkMaker(entityManager, makerName);
		if (check == true) {
			Maker maker = new Maker();
			maker = entityManager.createQuery("select e from Maker e where e.makerName = :makerName", Maker.class)
					.setParameter("makerName", makerName).getSingleResult();
			return maker;
		} else {
			System.out.println("Nie znaleziono danego producenta!!!");
			return null;
		}
	}

oraz
public void addNewProduct(EntityManager entityManager, String productName, String makerName, Category category) {
List<Product> productList = new ArrayList<>();
Product product = new Product();
product.setProductName(productName);
product.setCategory(category);
Maker maker = new Maker();
maker = returnMaker(entityManager, makerName);
if (maker.getProduct() == null) {
productList.add(product);
} else {
productList = maker.getProduct();
productList.add(product);
}
product.setMaker(maker);
maker.setProduct(productList);
saveToDataBase(entityManager, product);
}

I teraz w momencie kiedy chce dodać nowy produkt(metoda addNewProduct) a w bazie nie ma danego Producenta to (metoda retrunMaker) zwraca mi Null lecz nie przerywa działania metody addNewProduct i wywala mi nullPoitner(wiem, że mogę złapać wyjątek i go obsłużyć lecz chciałbym aby w momencie kiedy nie zostanie znaleziony producent program przestał wykonywać daną metode) 
Trochę pokombinowałem, ale jakoś jaśniej nie umiem napisać. Chcę aby nie zwracać nulla tylko jakoś przerywać działanie coś ala "break".

Z góry dziękuję za pomoc!!!
0

Po prostu fragment kodu metody, który nie chcesz żeby się wykonywał gdy coś jest nullem, to robisz

 
if (coś != null) {
// ciało metody
} 
0

z tego co mi wiadomo nie da się przerwać działania metody ale zawsze można kontrolować działanie metody, np. poprzez ustawienie typu wyjściowego na boolean i w momencie gdy np. danego produktu nie ma w bazie zwracaćtrue a gdy jest zwracać false i później w zależności od wyniku działać dalej.

0

Cześć!

Jest rok 2016 -> https://imgflip.com/i/1aoc6w

Wiec - tak najbardziej po chamsku:

 public Optional<Maker> returnMaker(EntityManager entityManager, String makerName) {
        boolean check = checkMaker(entityManager, makerName);
        if (check == true) {
            Maker maker = new Maker();
            maker = entityManager.createQuery("select e from Maker e where e.makerName = :makerName", Maker.class)
                    .setParameter("makerName", makerName).getSingleResult();
            return Optional.of(maker);
        } else {

            return Optional.empty();
        }
    }
public void addNewProduct(EntityManager entityManager, String productName, String makerName, Category category) {
        List<Product> productList = new ArrayList<>();
        Product product = new Product();
        product.setProductName(productName);
        product.setCategory(category);
        //Maker maker = new Maker(); - nie ma takiej potrzeby
        Optional<Maker> maybeMaker = returnMaker(entityManager, makerName);
        maybeMaker .ifPresent ( (maker) -> { 
            if (maker.getProduct() == null) {
              productList.add(product);
            } else {
             productList = maker.getProduct();
             productList.add(product);
          }
          product.setMaker(maker);
          maker.setProduct(productList);
          saveToDataBase(entityManager, product);
        } ) ;
    }
 

Ogólnie - to nie jest piekne - ale lepsze niż przerywanie jakimś break, catch etc.

Można by było to poprawić - gdyby maker.getProduct() mógł zwracać optionala - ale, ponieważ JPA to świnia - więc trzeba chwilowo z tym żyć.

3

I poprawmy ten kod jeszcze o krok:

 
public Optional<Maker> returnMaker(EntityManager entityManager, String makerName) {
        if (checkMaker(entityManager, makerName)) { //zamiast checkMaker  lepsza by była nazwa isValid albo exists (w zalezności co to sprawdza)
           fiinal Maker maker = entityManager.createQuery("select e from Maker e where e.makerName = :makerName", Maker.class)
                    .setParameter("makerName", makerName).getSingleResult();
            return Optional.of(maker);
        } else {
             return Optional.empty();
        }
    }
 
public void addNewProduct(EntityManager entityManager, String productName, String makerName, Category category) {
        final Product product = new Product(productName, category); //wywal settery daj konstruktor
        final Optional<Maker> maybeMaker = returnMaker(entityManager, makerName);
        maybeMaker .map( (maker) -> { 
            if (maker.getProduct() == null) {
              return Arrays.asList(product); 
            } else {
             List<Product> result = maker.getProduct(); //te 3 linie to nadaj koszmar... (ale JPA to świnia)
             result.add(product);
             return result;
          }
         }).ifPresent( productList-> {
             product.setMaker(maker);
             maker.setProduct(productList);
             saveToDataBase(entityManager, product);
         }) ;
    }
1

Jedziemy dalej....

 
public void addNewProduct(EntityManager entityManager, String productName, String makerName, Category category) {
        final Product product = new Product(productName, category); 
        returnMaker(entityManager, makerName)
            .map( (maker) ->  
                Optional.ofNullable( maker.getProduct())
                 .map( list -> {  list.add(product); return list;})
                 .orElse(Arrays.asList(product))
            ).ifPresent( productList-> {
              product.setMaker(maker);
              maker.setProduct(productList);
              saveToDataBase(entityManager, product);
          }) ;
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1