Главная Новости

Java - Вопрос о передаче final и возвращении final в методах - Stack Overflow на русском

Опубликовано: 01.09.2018

Надо будет переформулировать вопрос и яснее написать, так чтобы не только я понимал. Но и вороны выклевывающие печень.

Написал код состоящий из двух классов. На большинство возникших вопросов я ответил сам в комментариях. Остался вопрос: возникает предупреждение IDE в методе:

public void myClassTranfer(final ToTransfer myClass)' - "Exporting non-public type through public API".

Что означает эта ошибка и почему такое происходит?


Week 2

/* Файл: Transfer.java Пакет: transferBy Вопрос о передаче final и возвращении final в методах. Почему возвращается не финальный тип? Ответ: Потому, что final в данном случае относится к методу, а не к переменной. У нас final запрещает переопределение метода. Почему при упаковке и распаковке в методе final int -> Integer iInt-> final int, final куда-то изчез? Ответ: Потому, что мы вернули другую переменную, не i, а iInt. Остался вопрос: предупреждение - "Exporting non-public type through public API". Что оно означает и почему такое происходит? */ package transferBy; /** * * @author vvm */ class ToTransfer { // этот класс я сделал для того, чтобы передавать в метод как финальный, // хотя сам класс я не делаю финальным при объявлении private int i; public void set_i(int i) { this.i = i; } public int get_i() { return this.i; } } public class Transfer { public int method(int i) { i++; return i; } public final int methodFin(final int i) { //i = 10;// ошибка примитив финальный, тут все правильно Integer iInt = Integer.valueOf(i); iInt++; // упаковали и изменили значение // i = iInt.intValue(); нельзя return iInt;// !!! здесь произошла распаковка, но возврат метода final не final!!! Ответ: потому что у нас iInt не final, final относится к методу и запрещает его переопределять. } /* И еще в этом месте IDE ругается на public вопрос: почему предупреждение - "Exporting non-public type through public API" */ /* public*/ void myClassTranfer(final ToTransfer myClass) { myClass.set_i(20); // тут с финальным классом всё понятно // потому как запрещено только наследование класса, // мы можем менять значения полей класса } public static void main(String[] args) { ToTransfer toTransfer = new ToTransfer(); int i = 10; Transfer transfer = new Transfer(); i = transfer.methodFin(i);// меняем в методе финальное значение переменной. А на самом деле не меняем, а возвращаем новое значение другой переменной. // System.out.println(" i = " + i); i++; // мы вернули из метода final int, но мы можем менять значение!!! // хотя когда мы передаем переменную в метод (final int i), то в самом методе не // можем менять значение. То есть при возврате переменная не становится final? //Ответ: Мы не вернули финальную переменную.Тут final относится не к переменной а к методу. System.out.println(" i = " + i); transfer.myClassTranfer(toTransfer); System.out.println("toTransfer.i = " + toTransfer.get_i()); } } /* Вывод программы. run: i = 11 i = 12 toTransfer.i = 20 BUILD SUCCESSFUL (total time: 2 seconds) */
rss