перегруженный конструктор InnerClass внутри метода - PullRequest
0 голосов
/ 21 сентября 2018

Я читаю книгу Брюса Экеля "Мышление на Яве".Я сталкивался с этим утверждением в главе о внутреннем классе, которая гласит: «Единственное оправдание использования локального внутреннего класса вместо анонимного внутреннего класса - это если вам нужен именованный конструктор и / или перегруженный конструктор» *

Сейчас я не знаю, правильно ли я понял, но: Это способ перегрузки конструкторов Inner (локальных классов) внутри метода?

abstract class ForInner {
abstract String getName();
abstract void setName(String newName);
abstract int getNumber();
abstract void setNumber(int newNumber);

} class Outer {

public ForInner getSomeInner(String name) {
    class LocalInner extends ForInner{
        private String myName;
        private int myNumber;
        public LocalInner(String myName) {
            this.myName = myName;
        }
        public String getName() {
            return myName;
        }
        public void setName(String newName) {
            myName = newName;
        }
        public int getNumber() {
            return myNumber;
        }
        public void setNumber(int newNumber) {
            myNumber = newNumber;
        }
    }
    return new LocalInner(name);
}
public ForInner getSomeInner(int number) {
    class LocalInner extends ForInner{
        private String myName;
        private int myNumber;
        public LocalInner(int myNumber) {
            this.myNumber = myNumber;
        }
        public String getName() {
            return myName;
        }
        public void setName(String newName) {
            myName = newName;
        }
        public int getNumber() {
            return myNumber;
        }
        public void setNumber(int newNumber) {
            myNumber = newNumber;
        }
    }
    return new LocalInner(number);
}

}

Я не уверен, относится ли утверждение к этому.Но, возможно, есть предположение, что это не так, потому что Насколько было бы иначе использовать таким образом

abstract class ForInner {
abstract String getName();
abstract void setName(String newName);
abstract int getNumber();
abstract void setNumber(int newNumber);

}

lass Outer{
public ForInner inner (String name) {
    return new ForInner() {
        private String myName;
        private int myNumber;
        {
            myName = name;
        }
        public String getName() {
            return myName;
        }
        public void setName(String newName) {
            myName = newName;
        }
        public int getNumber() {
            return myNumber;
        }
        public void setNumber(int newNumber) {
            myNumber = newNumber;
        }
    };
}
public ForInner inner (int number) {
    return new ForInner() {
        private String myName;
        private int myNumber;
        {
            myNumber = number;
        }
        public String getName() {
            return myName;
        }
        public void setName(String newName) {
            myName = newName;
        }
        public int getNumber() {
            return myNumber;
        }
        public void setNumber(int newNumber) {
            myNumber = newNumber;
        }
    };
}

} заранее благодарен

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Ах, хорошо, когда у вас есть этот код

class OuterClass {
    public Runnable printA() {
        return new Runnable() {

            @Override
            public void run() {
                System.out.println("Print A");
            }
        };
    }
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        Runnable printA = outer.printA();
        Runnable printB = outer.printA();   
    }
}

В этом случае я не создаю несколько экземпляров одного анонимного внутреннего класса.Вместо этого я создаю несколько анонимных классов, которые используют один и тот же исходный код.Это Rigth ?!Спасибо

0 голосов
/ 21 сентября 2018
public class OuterClass {
    Runnable printA = new Runnable() {
        @Override
        public void run() {
            System.out.println("Print A");
        }
    };
    Runnable printB = new Runnable() {
        @Override
        public void run() {
            System.out.println("MESSAGE:" + " " + "Print B");
        }
    };

    class PrintMessage implements Runnable {
        private String msg;
        public PrintMessage(String msg) {
            this.msg = msg;
        }

        // overloaded constructor
        public PrintMessage(String prefix, String msg) {
            this.msg = prefix + " " + msg;
        }


        @Override
        public void run() {
            System.out.println(msg);
        }
    }
    Runnable printC = new PrintMessage("Print C");
    Runnable printD = new PrintMessage("Print D");
    Runnable printE = new PrintMessage("MESSAGE:", "Print E");

    public static void main(String[] args) {
        OuterClass sample = new OuterClass();
        sample.printA.run();
        sample.printB.run();
        sample.printC.run();
        sample.printD.run();
        sample.printE.run();
    }
}

Существует два экземпляра Runnable, реализованных как анонимные классы.Пока создается printA, вы не можете использовать его для создания printB.Вы должны создать анонимный класс с самого начала (т.е. переопределить все абстрактные методы).

Если внутренний класс создан на основе Runnable, вы можете использовать его в форме new PrintMessage() для создания новых экземпляров.Кроме того, можно использовать конструкторы не по умолчанию.

...