Java.Help

  • Автор теми AkeL.php
  • Дата створення

Пух

كنت بلهاء
Модератор
эм, что лучше использовать для описания констант, которые будут во многих классах? Интерфейс или класс?

Код:
public interface Constants{
     int SOME_CONSTANT = 0;
}
и каждым классом имплементировать этот интерфейс или

Код:
public static final class Constants{
     public static final int SOME_CONSTANT = 0;
}
и получать доступ к константе через Constants.SOME_CONSTANT ?
 

akl

geek
Можно использовать тот и тот вариант, правда второй встречается намного чаще. Единственное - класс можно не делать статическим.
 

Пух

كنت بلهاء
Модератор
Да, согласен. static не нужен. Спасибо.
 

bllem

New Member
эм, что лучше использовать для описания констант, которые будут во многих классах? Интерфейс или класс?

Код:
public interface Constants{
     int SOME_CONSTANT = 0;
}
и каждым классом имплементировать этот интерфейс или

Код:
public static final class Constants{
     public static final int SOME_CONSTANT = 0;
}
и получать доступ к константе через Constants.SOME_CONSTANT ?
извините, а какой смысл использовать множество констант во многих классах? Проще тогда создавать потомка. Это из серии создания объекта на каждую модель данных. У меня от такого garbage загнулся. Объявлял в мейн-классе.
Или вы имеете ввиду просто набор констант для использования различными классами? Тогда проще статический класс и статические поля в нем. Но все-равно костыли. В нетбинс есть хороший пример по этому поводу.
 

dreamer

Member
эм, что лучше использовать для описания констант, которые будут во многих классах? Интерфейс или класс?

Код:
public interface Constants{
     int SOME_CONSTANT = 0;
}
и каждым классом имплементировать этот интерфейс или

Код:
public static final class Constants{
     public static final int SOME_CONSTANT = 0;
}
и получать доступ к константе через Constants.SOME_CONSTANT ?
Лучше использовать интерфейс и получать доступ к константе Constants.SOME_CONSTANT.
А еще лучше использовать enum.
 

Пух

كنت بلهاء
Модератор
Код:
public class ArrayVector<T> {

    private T[] element;

    public ArrayVector(int size) {
        element = (T[])new Object[size];
    }

    public T get(int index) {
        return (T)element[index];
    }

    public void set(int index, T value) {
        element[index] = value;
    }

    public int size() {
        return element.length;
    }

    public  <T extends Comparable<T>> T min() {
        T min = (T)this.get(0);
        for (int i = 0; i < this.size(); i++) {
            if (min.compareTo((T) this.get(i)) > 0) {
                min = (T)this.get(i);
            }
        }
        return min;
    }
    
    public static void main(String args[]){
        ArrayVector<Double> vector = new ArrayVector<Double>(5);
        for (int i = 0; i < vector.size(); i++){
            vector.set(i,Math.random()*100);
            System.out.println(vector.get(i));
        }
        System.out.println("min = " + vector.min());
    }
}
В таком виде работает. Но, если убрать приведение типа в строке
Код:
T min = (T)this.get(0);
(или в других строках, где вызывается метод get(int)), то пишет что не совпадают типы
run:
52.54227964744932
8.119598892271352
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types
22.617445252979717
45.571300829738945
28.13554453538728
required: T
found: T
at ArrayVector.min(ArrayVector.java:24)
at ArrayVector.main(ArrayVector.java:39)
Java Result: 1
Что не так?

p.s. по идее, в методе get
Код:
    public T get(int index) {
        return element[index];
    }
приведение типа не обязательно, т.к. в конструкторе создается массив Object и приводится к типу T
 

Hamster

Well-Known Member
Ты же сам пишешь new Object[], тем самым создаешь массив простых объектов.
 

Пух

كنت بلهاء
Модератор

xwandi

mafia(:
У тебя в строке "public <T extends Comparable<T>> T min() {" происходит затенение одного типа другим.
 

Hamster

Well-Known Member
и там же привожу к типу T[]. В get(int) привожу к типу T.
меня немного вводит в ступор фраза компилятора
Object o = (Object) new String("hello");
Что вернет o.getClass().getName()? Неужто java.lang.Object? Ведь ты же привел к типу Object!!!
o в любом случае ссылается на String, и приводи его к чему хочешь хоть 10 раз, он всегда будет Стрингом.

И вообще, твои исходники не компилируються нифига.
То, что ты хочешь, можно написать вот так. +добавь rangeCheck() при работе с индексами, который будет кидать ексепшены в случае их неадекватности (как это сделано в ArrayList.java)
Код:
public class ArrayVector<T extends Comparable<T>> {

    private Object[] element;

    public ArrayVector(int size) {
        element = new Object[size];
    }

    public T get(int index) {
        return (T)element[index];
    }

    public void set(int index, T value) {
        element[index] = value;
    }

    public int size() {
        return element.length;
    }

    public T min() {
        T min = (T)this.get(0);
        for (int i = 0; i < this.size(); i++) {
            if (min.compareTo((T) this.get(i)) > 0) {
                min = (T)this.get(i);
            }
        }
        return min;
    }
    
    public static void main(String args[]){
        ArrayVector<Double> vector = new ArrayVector<Double>(5);
        for (int i = 0; i < vector.size(); i++){
            vector.set(i,Math.random()*100);
            System.out.println(vector.get(i));
        }
        System.out.println("min = " + vector.min());
    }
}
 
Останнє редагування:
Зверху