2015-07-06 3 views
0

У меня есть объявленный статический финал и дополнительно заморожен.Переопределение публичного конечного статического замороженного набора в Java/Gosu?

class MyParent { 
    public final static var MY_FIELDS : Set<MyParent> = { 
     FIELD1, FIELD2, FIELD3, FIELD4, FIELD5 
    }.freeze() 
} 

Теперь, поскольку MyParent.MY_FIELD вызывается из нескольких мест, чтобы сделать некоторые магические вещи, я хотел бы взять на себя пользу этого и просто переопределить саму коллекцию.

class MyChild extends MyParent { 
    public override static var MY_FIELDS : Set<MyChild> = { 
     FIELD1, FIELD3, FIELD5, FIELD8, FIELD9, FIELD10 
    }.freeze() 
} 

Я также пробовал использовать ключевое слово new, как это сделано в .NET.

class MyChild extends MyParent { 
    public new static var MY_FIELDS : Set<MyChild> = { 
     FIELD1, FIELD3, FIELD5, FIELD8, FIELD9, FIELD10 
    }.freeze() 
} 

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

И потом, я не могу получить доступ к методу getClass() или class член моего типа, ни MyParent «s.

Есть ли какое-либо обходное решение, которое позволило бы мне достичь этого и как?

Использование Gosu 8.0 в проекте Guidewire.

+0

Вам не следует бороться с вашим языком программирования. Кроме того, кажется, вы не знаете, чего хотите. Вы хотите изменить родительское поле, хотите ли вы его переопределить или хотите создать новое поле с тем же именем? Все три вопроса упоминаются в вашем вопросе. И никто из них не может решить вашу проблему, поскольку все они подразумевают, что вы хотите переменную 'static' (я даже не говорю о ее неизменной природе здесь), чтобы делать то, что не делают переменные' static'. – Holger

+0

Фактически, все, что я хочу, это переопределить значение, возвращаемое статической переменной через производный класс, поэтому создание экземпляра производного класса позволит статической переменной возвращать поля, специфичные для нее. –

+0

Это просто невозможно, поскольку это противоречит переменным 'static': переменные, которые существуют * ровно один раз *. Определение в классе предоставляет пространство имен и правила доступа, но в принципе каждая переменная 'static' является только глобальной переменной. Как сказано, факт, что переменная является «final», здесь даже не имеет отношения к делу. Обратите внимание, что даже если поле не было 'static', код базового класса не будет получать доступ к полю подкласса, если вы определяете поле с тем же именем. Это потребовало бы, чтобы метод nonstatic * * имел что-то, что вы можете переопределить в подклассе. – Holger

ответ

0

И тогда я не могу получить доступ к методу getClass() или классу моего типа, ни MyParent.

Это было некоторое время, но я помню поддержку Gosu/проволочный направитель определенно это. Они просто не имеют того же имени, что и их Java-аналоги.

Вы можете попробовать в Gosu Scratchpad и использовать функцию автозаполнения Guidewire Studio, чтобы найти необходимые методы. Или просто используйте декомпилятор в корневом классе, чтобы увидеть, какую функцию они предоставляют. Конечно, есть getClass.

Как сказал Хольгер, это может быть хлопотно и «взломанно», чтобы использовать метод отражения. Хорошо, я признаю, что я делаю это один раз, используя рефлексию для разработки индивидуальной синхронизации контактов между Contact Manager и Claim Center. Это с определенным успехом, хотя время на поддержку этого решения занимает довольно много времени.

0

Я понимаю, что этот вопрос немного устарел, и я использую gw v9, но я обнаружил, что единственный способ полностью использовать рефлексию (в том числе возможность «setAccessible») в Госу - это сделать это :

var myClass = myObject.Type.getBackingClass() 

с, что вы можете продолжать, как и в Java, получать объявленные конструктор/поле/методы, статические или нет, установить их доступными и все другие вещи вы не должны делать.