Nie zwracanie obiektu danej klasy w metodzie

Nie zwracanie obiektu danej klasy w metodzie
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
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);
}

Kopiuj
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!!!
PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2787
0

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

Kopiuj
 
if (coś != null) {
// ciało metody
} 
R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 208
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.

  • Rejestracja: dni
  • Ostatnio: dni
0

Cześć!

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

Wiec - tak najbardziej po chamsku:

Kopiuj
 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();
        }
    }
Kopiuj
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ć.

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4714
3

I poprawmy ten kod jeszcze o krok:

Kopiuj
 
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();
        }
    }
Kopiuj
 
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);
         }) ;
    }
jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4714
1

Jedziemy dalej....

Kopiuj
 
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);
          }) ;
    }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.