Статическая реализация метода объектной области в Java - PullRequest
0 голосов
/ 05 января 2012

Привет: у меня есть класс, определяющий следующий метод:

public String abstract getAnimalName(); 

И подкласс

class Ralph extends Animal
{
    public String getAnimalName(){return "RALPH";}
}

Я хочу, чтобы getAnimalName для "Ralph" был статическим, посколькутолько одна версия имени Ральфа без гражданства.

Таким образом, я хочу реализовать getAnimalName статически, все еще удовлетворяя интерфейсу.Это возможно ?Может быть, есть ли способ, которым я могу использовать внедрение зависимостей или технику AOP, чтобы обеспечить реализацию объекта путем прокси статической реализации во время выполнения?

Очевидное решение (с помощью метода объектной области обтекания статическим методом) немного упрощает мой вкус.

Ответы [ 5 ]

4 голосов
/ 05 января 2012

Нет, ваше последнее предложение - это все, что вы можете сделать.

Это может быть предупреждением о том, что в дизайне есть что-то подозрительное.

Ральф является экземпляром, и поэтому он должен подчиняться контракту getAnimalName.

2 голосов
/ 05 января 2012

Вы будете лучше всего делать:

class Ralph extends Animal { 

    private static final String NAME = "RALPH";

    public String getAnimalName(){return NAME;} 
} 

Вы также можете сделать NAME публичным, если хотите.

1 голос
/ 05 января 2012

Дизайн должен быть проверен наверняка. Если вы довольны архитектурой, я бы превратил класс в одноэлементный и использовал Ralph.getInstance (). GetAnimalName ().

Возможно, рассмотрите аннотации для этого?

@Name("RALPH")
class Ralph extends Animal
{}

Вы можете извлекать аннотации из объекта Class: http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getAnnotations()

0 голосов
/ 05 января 2012

На самом деле нет концепции более чем одного экземпляра метода. Он не добавляет дополнительной памяти при создании нескольких Ralph объектов.

Однако вы можете создать метатип.

0 голосов
/ 05 января 2012

Почему бы вам не изменить свой код следующим образом:

class Ralph extends Animal
{
    public static String NAME = "RALPH";
}

class Animal {
    public static String NAME;

}

больше, чем используйте ваш getAnimalName () метод.

...