Класс со многими вложенными статическими классами -> использование частных абстрактных классов для организации статических методов, а затем расширения. Это хорошая практика? - PullRequest
0 голосов
/ 15 июня 2019

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

Вот пример того, о чем я говорю:

public class PetTrainer
{
    public PetTrainer(...)
    {...}

    public static class LeashInstruction extends LeashInstructionAbstract
    {
    //No Code
    }
}

В той же упаковке:

abstract class LeashInstructionAbstract
{
    public static void giveTreat(...)
    {...}

    public static...
    //imagine more
}

1 Ответ

0 голосов
/ 15 июня 2019

просто для пояснения, что статический метод наследуется в подклассе, но он не полиморфен, поскольку вы не можете переопределить их, хотя вы можете скрыть его, когда у вас есть метод с такой же сигнатурой в подклассе.и если вы хотите сделать вещи чище, вам не нужно создавать пустой статический класс.Вот мои два предложения, основанные на том, чего вы хотите достичь.1. в случае, если инструкция LeashInstruction одинакова для всех дрессировщиков, вы можете сделать следующее:

public class PetTrainer 
{
    public PetTrainer(...)
    {...}

}

и:

abstract class LeashInstructionAbstract {
    public static void giveTreat() {}
}

в случае, если поведение в классе PetTrainer изменится, тогда я бы предложил сделать следующее (интерфейс с абстрактными методами):

открытый класс PetTrainer {LeashInstructionImpl leashInstruction = new LeashInstructionImpl ();public PetTrainer () {}

public static class LeashInstructionImpl implements LeashInstruction {
    @Override
    public void giveTreat() {
        //somthing
    }
}

// Just for testing
public static void main(String[] args) {
    PetTrainer petTrainer = new PetTrainer();
    petTrainer.leashInstruction.giveTreat();
}

}
, и LeashInstruction будет:

interface LeashInstruction {void giveTreat ();// представьте больше
}

Надеюсь, что это поможет.

...